如何在ANTLR4中实现此规则?

时间:2018-03-01 16:24:28

标签: antlr antlr4

如何在ANTLR4中实现此规则:

  

multiline-comment-text-item - >除/ *或* /

之外的任何Unicode标量值

2 个答案:

答案 0 :(得分:0)

在ANTLR中,你不能说:“匹配这个或那个字符,除了这些多个(!)字符”。你只能说“匹配这个或那个字符,除了这些单个(!)字符”:

ANY_EXCEPT_STAR : ~[*];
ANY_EXCEPT_FSLASH : ~[/];

FOO : ~[/*];匹配除/*之外的任何单个字符。

我不会在自己的词法分析器规则中匹配multiline-comment-text-item,而是在multiline-comment-text里面(最有可能)使用它:

MultilineCommentText
 : '/*' .*? '*/'
 ;

请务必在其中加入?,使其不合适。

请注意,这些令牌经常被隐藏或丢弃,因此它们不会最终出现在解析器规则中。那样做:

MultilineCommentText
 : '/*' .*? '*/' -> skip
 ;

MultilineCommentText
 : '/*' .*? '*/' -> channel(HIDDEN)
 ;

请参阅:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md

答案 1 :(得分:0)

我试图用ANTLR4解析Swift时遇到了这个规则。以下是我的实施:

MULTILINE_COMMENT
    : '/*' ('/'*? MULTILINE_COMMENT | ('/'* | '*'*) ~[/*])*? '*'*? '*/'
;

没有必要像在文档中那样将multiline-comment分成许多子规则。