add mode grammar

This commit is contained in:
mii8080
2022-07-14 01:36:39 +00:00
committed by GitHub
parent a1d0d04f1d
commit 10c6e0c63d
6 changed files with 30 additions and 4 deletions

View File

@ -5,6 +5,7 @@ WS
-> skip -> skip
; ;
SHARP: '#' ;
DOLLER: '$' ; DOLLER: '$' ;
ADD: '+' ; ADD: '+' ;
SUB: '-' ; SUB: '-' ;

View File

@ -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 ;

View File

@ -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,

View File

@ -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 ;
*/ */

View File

@ -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("-"),

View File

@ -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,