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