我正在尝试使用ANTLR实现语义分析器。 分析器需要进行分析:
如何使用词法作用域和Java解决以前的问题?
这是语法:
grammar ComplexStaticAnalysis;
// PARSER RULES
block : '{' statement* '}';
statement : assignment ';'
| deletion ';'
| print ';'
| functioncall ';'
| ifthenelse
| declaration
| block ;
assignment : ID '=' exp ;
deletion : 'delete' ID ;
print : 'print' exp ;
functioncall : ID '(' (exp (',' exp)* )? ')' ;
ifthenelse : 'if' '(' exp ')' 'then' block 'else' block ;
declaration : type ID '=' exp ';'
| ID '(' ( parameter ( ',' parameter)* )? ')' block ;
type : 'int'
| 'bool' ;
parameter : ('var')? type ID ;
exp : ('-')? left=term (('+' | '-') right=exp)? ;
term : left=factor (('*' | '/') right=term)? ;
factor : left=value (op=ROP right=value)?
| left=value (op=('&&' | '||') right=value)? ;
value : INTEGER
| ( 'true' | 'false' )
| '(' exp ')'
| ID ;
// LEXER RULES
ROP : '==' | '>' | '<' | '<=' | '>=' | '!=' ;
//Numbers
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+;
//IDs
fragment CHAR : 'a'..'z' |'A'..'Z' ;
ID : CHAR (CHAR | DIGIT)* ;
//ESCAPE SEQUENCES
WS : (' '|'\t'|'\n'|'\r')-> skip ;
LINECOMENTS : '//' (~('\n'|'\r'))* -> skip ;
BLOCKCOMENTS : '/*'( ~('/'|'*')|'/'~'*'|'*'~'/'|BLOCKCOMENTS)* '*/' -> `skip ;
ERR : . -> channel(HIDDEN);