Java 用于定制需求的Antlr解析器
我有一个非常特殊的需求,需要使用ANTLR解析输入。我希望能够像解析表达式 正确输入Java 用于定制需求的Antlr解析器,java,antlr,antlr3,Java,Antlr,Antlr3,我有一个非常特殊的需求,需要使用ANTLR解析输入。我希望能够像解析表达式 正确输入 用户名 用户名 |吃任何东西都可以来这里/好的|吃 无效输入 用户/名称 用户名^face(&N) 那么,在|EATALL之后和|EATALL之前出现的任何表达式(如果有)都必须作为单个标记获取。如果其他简单输入没有出现|EATALL,则只有、-、[a-zA-Z0-9]的有效组合被标记为一个标记。在伪代码中 用户名->[用户名][名称] 用户名->[用户名] |EATALL user/name my
- 用户名
- 用户名
- |吃任何东西都可以来这里/好的|吃
- 用户/名称
- 用户名^face(&N)
|EATALL
之后和|EATALL
之前出现的任何表达式(如果有)都必须作为单个标记获取。如果其他简单输入没有出现|EATALL
,则只有
、-
、[a-zA-Z0-9]
的有效组合被标记为一个标记。在伪代码中
- 用户名->[用户名][名称]
- 用户名->[用户名]
- |EATALL user/name my user->[user/name my user]
对我来说,这似乎已经是一个模棱两可的标记化案例。我正在寻求您对antlr处理此类问题的建议。提前感谢你。那么,你试过什么了?您的问题是针对Antlr 3的,还是可以使用Antlr 4 对于Antlr 3,您可以使用语义谓词来条件令牌规则选择。由于Antlr 4没有符号语义谓词,因此可以使用本机代码操作实现基本相同的结果。例如(未经测试):
乍一看,您的问题似乎可以由正则表达式处理,而不需要上下文无关的语法。所以我认为没有必要使用Antlr,这只是输入解析问题的一小部分。我特别请求有关antlr的帮助。我特别是在Antlrv3的上下文中进行讨论。我真的被卡住了。我不知道如何强制lexer在EATALL出现时创建一个大标记,在简单输入时创建不同的标记。正如我所说,使用语义谓词启用“EATALL”规则。将该规则置于简单输入规则之上。在EadAll规则上使用本机代码操作,从标记文本中修剪不需要的文本。在EatAll规则中使用a,使用标记之间的文本。该链接返回到Antlr4文档。对于Antlr4,*?这是一个没有芦苇的地方。对于Antlr3.5语法,.*构造默认为nongreedy.ok。。。我现在检查你的建议。谢谢您的时间。:)
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] ;