我正在为自己正在构建的编程语言创建解析器,但遇到一个问题:ANTLR似乎打算不匹配变量声明。
这是语法:
// Define a grammar called simc
grammar simc;
//Parser Rules
program : statement+ ;
statement : declaration | assignment | ( expression SEMICOLON ) ;
expression : LEFTPAREN expression RIGHTPAREN #parenthesisExp
//Math
| <assoc=right> expression '^' expression #powerExp
| expression (ASTERISK|SLASH) expression #mulDivExp
| expression (PLUS|MINUS) expression #addSubExp
//Bool Operations
| expression EQUALITY expression #equalCompExp
| expression NONEQUALITY expression #notequalCompExp
| expression GREATERTHAN expression #greaterCompExp
| expression LESSTHAN expression #lessCompExp
| expression GREATERTHANOREQUALTO expression #greaterorequalCompExp
| expression LESSTHANOREQUALTO expression #lessorequalCompExp
//Any value that isn't an expression itself
| value #valueExp
;
value : constvalue | functioncall | variable ;
functioncall : IDENTIFIER LEFTPAREN expression? ( COMMA expression )? RIGHTPAREN ;
declaration : typelabel variable EQUALS expression SEMICOLON ;
assignment : variable EQUALS expression SEMICOLON ;
constvalue : intvalue | floatvalue | stringvalue | boolvalue ;
typelabel : INTLABEL | FLOATLABEL | STRINGLABEL | BOOLLABEL ;
variable : IDENTIFIER ;
intvalue : INTVALUE ;
floatvalue : FLOATVALUE ;
stringvalue : STRINGVALUE ;
boolvalue : BOOLVALUE ;
//Lexer Rules
IDENTIFIER : [a-zA-Z][a-zA-Z0-9]* ;
LEFTPAREN : '(' ;
RIGHTPAREN : ')' ;
INTLABEL : I N T ;
FLOATLABEL : F L O A T ;
STRINGLABEL : S T R I N G ;
BOOLLABEL : B O O L ;
INTVALUE : [0-9]+ ;
FLOATVALUE : [0-9]+ ( PERIOD [0-9]+ F? | F ) ;
STRINGVALUE : QUOTE ( '\\"' | . )*? QUOTE ;
BOOLVALUE : ( T R U E ) | ( F A L S E ) ;
SEMICOLON : ';' ;
ASTERISK : '*' ;
SLASH : '/' ;
PLUS : '+' ;
MINUS : '-' ;
EQUALS : '=' ;
EQUALITY : '==' ;
NONEQUALITY : '!=' ;
GREATERTHAN : '>' ;
LESSTHAN : '<' ;
GREATERTHANOREQUALTO : '>=' ;
LESSTHANOREQUALTO : '<=' ;
COMMA : ',' ;
PERIOD : '.' ;
QUOTE : '"' ;
fragment A : [aA] ; // match either an 'a' or 'A'
fragment B : [bB] ;
fragment C : [cC] ;
fragment D : [dD] ;
fragment E : [eE] ;
fragment F : [fF] ;
fragment G : [gG] ;
fragment H : [hH] ;
fragment I : [iI] ;
fragment J : [jJ] ;
fragment K : [kK] ;
fragment L : [lL] ;
fragment M : [mM] ;
fragment N : [nN] ;
fragment O : [oO] ;
fragment P : [pP] ;
fragment Q : [qQ] ;
fragment R : [rR] ;
fragment S : [sS] ;
fragment T : [tT] ;
fragment U : [uU] ;
fragment V : [vV] ;
fragment W : [wW] ;
fragment X : [xX] ;
fragment Y : [yY] ;
fragment Z : [zZ] ;
WS : [ \r\t\n]+ -> skip ;
COMMENT : ( ( '/' '/' .*? ( '\r'|'\t'|'\n' ) ) | '/*' .*? '*/' ) -> skip ;
如果我没记错的话,语法应匹配代码int a = 5;
作为变量的声明。取而代之的是,我得到一个空语句(我不理解该特定事件的发生方式),被标记为不正确的语句包含int文本(在我的测试中,它仅适用于有效的类型名称)和正确的赋值。据我所知,应该在分配作业之前找到声明,对吗?为什么这样匹配,我该如何解决?
答案 0 :(得分:1)
如果查看为输入生成的令牌,您会看到它将 RadioGroup radioGroup;
SharedPref sharedPref;
radioGroup = findViewById(R.id.rb1);
sharedPref = new SharedPref(getContext());
radioGroup.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton radioButton = group.findViewById(checkedId);
int id=radioButton.getId();
sharedPref.someMethod(id);
}
});
视为int
,而不是IDENTIFIER
。发生这种情况是因为您在语法中的INTLABEL
之前定义了IDENTIFIER
,并且当多个词法分析器规则可以匹配相同数量的输入时,它将使用语法中的第一个规则。因此,您应该始终在关键字之后 定义标识符规则。