如何解决Antlr4:以 * 开头时跳过一行,除非第二个字符是
在我的输入中,以 int
开头的行是注释行,除非它以 float
或 *
开头。我可以忽略评论,但需要得到其他评论。
这是我的词法分析器规则:
*+
示例:
*-
所以,前两个是注释行,我可以跳过它。但是我不知道要定义可以捕获最后一行的词法分析器/解析器规则。
解决方法
您的 SkipTokens
词法分析器规则永远不会匹配,因为规则 WhiteSpaces
和 Newlines
放在它之前。请参阅此问答以了解词法分析器如何匹配标记: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 举报,一经查实,本站将立刻删除。