diff options
Diffstat (limited to 'lib/grammar.txt')
-rw-r--r-- | lib/grammar.txt | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/grammar.txt b/lib/grammar.txt new file mode 100644 index 0000000..d7208ef --- /dev/null +++ b/lib/grammar.txt @@ -0,0 +1,100 @@ +location: + | LOCATION_START EOL* + line_statement* + LOCATION_END EOL* + EOF + +line_statement: + | COMMENT EOL+ // A comment + | COLUMN IDENT EOL* // A location + | instruction, line_sep + | inline_action line_sep + | ACT expression COLUMN EOL+ // ACT … END ACT + line_statement* + END ACT? // Yes you can have END or END ACT + line_sep + | IF expression COLUMN EOL+ // IF … END IF + line_statement* + elif* + else + END IF? // Yes you can have END or END IF + line_sep + +elif: + | ELIF + expression COLUMN EOL+ + line_statement* + +else: + | ELSE EOL+ + line_statement* + | + +line_sep: + | EOL+ + | AMPERSAND+ EOL* + + +instruction: + | expression + | let_assignation + | keyword argument(expression) + +keyword: + | STAR KEYWORD // A keyword starting with * + | KEYWORD + +let_assignation: + | assignation + variable + assignation_operator + expression + +assignation: + | + | LET + | SET + +assignation_operator: + | EQUAL + | INCR // += + | DECR // -= + +inline_action: + | ACT expression COLUMN // There is a recursive code here + | IF expression COLUMN // Because ACT: can contains an IF: etc + (ELSE, instruction)? // complicated to flatten here. + +expression: + | delimited(l_paren, expression, r_paren) + | unary_operator expression + | expression binary_operator expression + | literal + | integer + | variable + | function argument(expression) + +unary_operator: + | OBJ + | LOC + | NO + | MINUS + | PLUS + +binary_operator: + | EQUAL + | LT GT // Different + | EXCLAMATION // Neg, not a comment here + | PLUS + | MINUS + | STAR // Not the first char of keyword here + | DIV + | MOD + | GT + | LT + | GT EQUAL + | LT EQUAL + | EQUAL GT // Alternative syntax + | EQUAL LT // Alternative syntax + | AND + | OR |