我试图创建一个逐行解析文件的语法。
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;
当我发送lexem' Object o'对于语法,输出是ANY而不是OBJ。
'Object o' => 'ANY' // I would like OBJ
我知道ANY_STRING更长,但我按顺序写了lexer令牌。有什么问题?
非常感谢你的帮助! ;)
答案 0 :(得分:1)
对于词法规则,具有最长匹配的规则获胜,与规则排序无关。如果匹配长度相同,则第一个列出的规则获胜。
要使规则顺序有意义,请将 Total/Average NaN NaN $NaN NaN% $NaN $NaN
规则的可能匹配长度减少为与任何关键字或ID相同或更小:
ANY_STRING
<强>更新强>
要了解词法分子实际在做什么,dump the token stream。