Merge commit '10c6e0c63db0fbed4b98a09ff5b9874a880e59cc'

This commit is contained in:
mii8080
2022-07-14 01:46:29 +00:00
committed by GitHub
6 changed files with 30 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -113,6 +113,7 @@ impl Tokenizer {
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);
}
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,