我有一个非常特殊的要求,使用ANTLR解析输入。我希望能够解析像;
这样的表达式更正输入
输入无效
嗯,| EATALL
&之后的任何表达。在| EATALL
之前(如果有的话)必须作为单个标记获得。如果其他简单输入未显示| EATALL
,则只有_
,-
,[a-zA-Z0-9]
的有效组合会被标记为一个标记。在伪代码中,
对我来说,这似乎是一种模糊的标记化案例。我正在寻找你在antlr处理这些问题的建议。高级感谢你。
答案 0 :(得分:0)
那么,你有什么尝试?您是否对Antlr 3有疑问,或者您可以使用Antlr 4吗?
对于Antlr 3,您可以使用语义谓词来调整令牌规则选择。由于Antlr 4没有符号语义谓词,因此您可以使用本机代码操作来实现基本相同的结果。例如(未经测试):
lexer grammar eatall ;
ValidSimple : { isCurrenLineJustTEXTandWS() }? TEXT ;
-- or --
ValidSimple : TEXT ( WS TEXT)* EOL? { emitEachTEXTasNewValidSimpleToken(); } ;
ValidEatAll : IgnoreL .*? IgnoreR { trimIgnoreLRTextfromTokenText(); } ;
Invalid : WS+ | .*? EOL? -> channel(HIDDEN) ;
IgnoreL : .*? MARK ;
IgnoreR : MARK .*? EOL? ;
fragment MARK : '| EATALL' ;
fragment TEXT : [a-zA-Z0-9_-] ;
fragment EOL : '\r'? '\n' ;
fragment WS : [ \t] ;