我正在尝试创建一种语法,逐行解析文件。
grammar Comp;
options
{
language = Java;
}
@header {
package analyseur;
import java.util.*;
import component.*;
}
@parser::members {
/** Line to write in the new java file */
public String line;
}
start
: objectRule {System.out.println("OBJ"); line = $objectRule.text;}
| anyString {System.out.println("ANY"); line = $anyString.text;}
;
objectRule : ObjectKeyword ID ;
anyString : ANY_STRING ;
ObjectKeyword : 'Object' ;
ID : [a-zA-Z]+ ;
ANY_STRING : (~'\n')+ ;
WhiteSpace : (' '|'\t') -> skip;
当我将词汇'Object o'发送给语法时,输出为ANY而不是OBJ。
'Object o' => 'ANY' // I would like OBJ
我知道ANY_STRING更长,但是我按顺序编写了词法分析器令牌。问题是什么 ?
非常感谢您的帮助 ! ;)
最佳答案
对于词法分析器规则,匹配最长的规则获胜,而与规则顺序无关。如果匹配长度相同,则第一个列出的规则将获胜。
为了使规则顺序有意义,请减小ANY_STRING
规则的可能匹配长度,使其等于或小于任何关键字或ID:
ANY_STRING: ~( ' ' | '\n' | '\t' ) ; // also?: '\r' | '\f' | '_'
更新资料
要查看词法分析器的实际操作,请dump the token stream。
关于java - Antlr4无法识别标识符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31412106/