使用ANTLR

时间:2019-05-02 13:22:10

标签: java antlr analysis semantic-analysis

我正在尝试使用ANTLR实现语义分析器。 分析器需要进行分析:

  1. 未声明的变量/函数
  2. 多次声明变量(例如int x = 4;删除x; int x = 5;不正确)
  3. 类型正确性
  4. 当前参数不符合形式参数(包括通过var传递的检查参数)
  5. delete可以删除任何标识符,甚至功能标识符。约束 重要的是标识符必须在同一块中声明。与一个 例外:函数体内的删除可以删除变量 通过引用传递给调用方的信息。 [示例f(var a)=删除a] 可以修改通过引用传递的调用者变量。

如何使用词法作用域和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);

0 个答案:

没有答案