prog8/il65/antlr/il65.g4

114 lines
1.7 KiB
Plaintext
Raw Normal View History

2018-08-08 23:54:43 +00:00
/*
IL65 lexer and parser grammar
*/
grammar il65;
NAME : [a-zA-Z_][a-zA-Z0-9_]* ;
DEC_INTEGER : ('0'..'9') | (('1'..'9')('0'..'9')+);
HEX_INTEGER : '$' (('a'..'f') | ('A'..'F') | ('0'..'9'))+ ;
BIN_INTEGER : '%' ('0' | '1')+ ;
module :
line*
EOF
;
line :
directive
| vardecl
| assignment
| augassignment
;
directive :
'%' singlename (literalvalue)?
;
vardecl:
datatype arrayspec? singlename ('=' expression)?
;
datatype:
'byte' | 'word' | 'float' | 'str' | 'str_p' | 'str_s' | 'str_ps'
;
arrayspec:
'[' expression (',' expression)? ']'
;
assignment :
assign_target '=' expression
;
augassignment :
assign_target ('+=' | '-=' | '/=' | '//=' | '*=' | '**=' |
'<<=' | '>>=' | '<<@=' | '>>@=' | '&=' | '|=' | '^=') expression
;
expression :
unary_expression
| '(' expression ')'
| expression '**' expression
| expression ('*' | '/' | '//' | '**') expression
| expression ('+' | '-' | '%') expression
| expression ('<<' | '>>' | '<<@' | '>>@' | '&' | '|' | '^') expression
| expression ('and' | 'or' | 'xor') expression
| expression ('==' | '!=' | '<' | '>' | '<=' | '>=') expression
| literalvalue
| register
| dottedname
| singlename
;
unary_expression:
'~' expression
| ('+' | '-') expression
| 'not' expression
;
singlename:
NAME
;
dottedname:
NAME ('.' NAME)+
;
register:
'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'SC' | 'SI' | 'SZ'
;
literalvalue:
BIN_INTEGER | HEX_INTEGER | DEC_INTEGER
| 'true' | 'false'
| array
;
array:
'[' expression (',' expression)* ']'
;
assign_target:
register
| singlename
| dottedname
;
COMMENT :
';' ~[\r\n]* -> channel(1)
;
WS :
[ \t] -> skip
;
EOL :
[\r\n]+ -> skip
;