0

我对使用 ANTLR 解析输入有一个非常特殊的要求。我希望能够解析如下表达式;

正确的输入

  • 用户名
  • 用户名用户名
  • | EATALL 任何东西都可以来这里/ok | 全部吃掉 ...

无效输入

  • 用户名
  • 用户名^人脸

好吧,任何出现在| EATALL和之前| EATALL(如果有的话)的表达式都必须作为单个标记获得。而在| EATALL没有出现其他简单输入的情况下,只有_, -,的有效组合[a-zA-Z0-9]被标记为一个标记。在伪代码中,

  • 用户名 -> [用户] [名称]
  • 用户名 -> [用户名]
  • |EATALL 用户/命名我的用户 -> [用户/命名我的用户]

对我来说,这似乎是一个模棱两可的标记化案例。我正在寻求您对在 antlr 中处理此类问题的建议。提前谢谢你。

4

1 回答 1

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] ;
于 2013-04-03T20:00:24.967 回答