mirror of
https://github.com/mii443/encrypt.git
synced 2025-08-22 15:05:33 +00:00
Merge commit '10c6e0c63db0fbed4b98a09ff5b9874a880e59cc'
This commit is contained in:
@ -5,6 +5,7 @@ WS
|
||||
-> skip
|
||||
;
|
||||
|
||||
SHARP: '#' ;
|
||||
DOLLER: '$' ;
|
||||
ADD: '+' ;
|
||||
SUB: '-' ;
|
||||
|
@ -17,12 +17,13 @@ stmt: let
|
||||
;
|
||||
|
||||
let: LET IDENT COLON IDENT SEMICOLON ;
|
||||
block: permission? LCURL stmt* RCURL ;
|
||||
block: permission? mode? LCURL stmt* RCURL ;
|
||||
return: RETURN expr? SEMICOLON ;
|
||||
if: IF LPAREN expr RPAREN stmt (ELSE stmt)? ;
|
||||
while: WHILE LPAREN expr RPAREN stmt ;
|
||||
for: FOR LPAREN expr? SEMICOLON expr? SEMICOLON expr? RPAREN stmt ;
|
||||
|
||||
mode: SHARP IDENT ;
|
||||
permission: DOLLER LPAREN ( IDENT LBRACKET ( IDENT COMMA? )* RBRACKET COMMA? )* RPAREN ;
|
||||
|
||||
expr: assign ;
|
||||
|
@ -20,6 +20,9 @@ pub enum Node {
|
||||
args: HashMap<String, String>,
|
||||
body: Vec<Box<Node>>
|
||||
},
|
||||
Mode {
|
||||
mode: String
|
||||
},
|
||||
Permission {
|
||||
accept: Vec<String>,
|
||||
reject: Vec<String>
|
||||
@ -58,7 +61,8 @@ pub enum Node {
|
||||
},
|
||||
Block {
|
||||
stmts: Vec<Box<Node>>,
|
||||
permission: Option<Box<Node>>
|
||||
permission: Option<Box<Node>>,
|
||||
mode: Option<Box<Node>>,
|
||||
},
|
||||
Define {
|
||||
name: String,
|
||||
|
@ -110,6 +110,13 @@ impl Parser {
|
||||
None
|
||||
};
|
||||
|
||||
debug!("parsing mode");
|
||||
let mode = if self.tokenizer.current_token().str == "#" {
|
||||
Some(self.mode()?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
if self
|
||||
.tokenizer
|
||||
.consume_kind_str(TokenKind::RESERVED, String::from("{")) || permission != None
|
||||
@ -120,7 +127,7 @@ impl Parser {
|
||||
.tokenizer
|
||||
.consume_kind_str(TokenKind::RESERVED, String::from("}"))
|
||||
{
|
||||
return Ok(Box::new(Node::Block { stmts, permission: permission }));
|
||||
return Ok(Box::new(Node::Block { stmts, permission: permission, mode: mode }));
|
||||
} else {
|
||||
stmts.push(self.stmt()?);
|
||||
}
|
||||
@ -207,6 +214,16 @@ impl Parser {
|
||||
return node;
|
||||
}
|
||||
|
||||
/*
|
||||
mode: SHARP IDENT ;
|
||||
*/
|
||||
pub fn mode(&mut self) -> Result<Box<Node>, String> {
|
||||
self.tokenizer.expect(String::from("#"))?;
|
||||
let mode = self.tokenizer.current_token().clone();
|
||||
self.tokenizer.expect_kind(TokenKind::IDENT)?;
|
||||
return Ok(Box::new(Node::Mode { mode: mode.str }));
|
||||
}
|
||||
|
||||
/*
|
||||
permission: DOLLER LPAREN ( IDENT LBRACKET ( IDENT COMMA? )* RBRACKET COMMA? )* RPAREN ;
|
||||
*/
|
||||
|
@ -113,6 +113,7 @@ impl Tokenizer {
|
||||
String::from("-="),
|
||||
String::from("*="),
|
||||
String::from("/="),
|
||||
String::from("#"),
|
||||
String::from("$"),
|
||||
String::from("+"),
|
||||
String::from("-"),
|
||||
|
@ -458,7 +458,7 @@ impl GPSL {
|
||||
|
||||
return Ok(None);
|
||||
}
|
||||
Node::Block { stmts, permission } => {
|
||||
Node::Block { stmts, permission, mode } => {
|
||||
let accept = self.blocks.front().unwrap().accept.clone();
|
||||
let reject = self.blocks.front().unwrap().reject.clone();
|
||||
let (accept, reject) = if let Node::Permission { accept, reject } = *permission.unwrap_or(Box::new(Node::None)) {
|
||||
@ -467,6 +467,8 @@ impl GPSL {
|
||||
(accept, reject)
|
||||
};
|
||||
|
||||
if let Node::Mode { mode } = *mode.unwrap_or(Box::new(Node::None)) {}
|
||||
|
||||
self.blocks.push_front(Block {
|
||||
accept: accept,
|
||||
reject: reject,
|
||||
|
Reference in New Issue
Block a user