微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Antlr4:以 * 开头时跳过一行,除非第二个字符是

如何解决Antlr4:以 * 开头时跳过一行,除非第二个字符是

在我的输入中,以 int 开头的行是注释行,除非它以 float* 开头。我可以忽略评论,但需要得到其他评论

这是我的词法分析器规则:

*+

示例:

*-

所以,前两个是注释行,我可以跳过它。但是我不知道要定义可以捕获最后一行的词法分析器/解析器规则。

解决方法

您的 SkipTokens 词法分析器规则永远不会匹配,因为规则 WhiteSpacesNewlines 放在它之前。请参阅此问答以了解词法分析器如何匹配标记:ANTLR Lexer rule only seems to work as part of parser rule,and not part of another lexer rule

要使其按预期工作,请执行以下操作:

SkipTokens  : (WhiteSpaces | Newlines) -> skip;

fragment WhiteSpaces : [ \t]+;
fragment Newlines    : [\r\n]+;

什么是 fragment,请查看此问答:What does "fragment" mean in ANTLR?

现在,回答你的问题。您将 Comment 规则定义为始终以换行符结尾。这意味着在您输入的末尾不能有评论。因此,您应该让注释以换行符或 EOF 结尾。

这样的事情应该可以解决问题:

COMMENT
 : '*' ~[+\-\r\n] ~[\r\n]* // a '*' must be followed by something other than '+','-' or a line break
 | '*' ( [\r\n]+ | EOF )   // a '*' is a valid comment if directly followed by a line break,or the EOF
 ;

STAR_MINUS
 : '*-'
 ;

STAR_PLUS
 : '*+'
 ;

SPACES
 : [ \t\r\n]+ -> skip
 ;

当然,这并不要求 * 位于行首。如果需要,请查看此问答:Handle strings starting with whitespaces

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。