当前位置: 首页 > 知识库问答 >
问题:

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

葛昱
2023-03-14

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

这是我的lexer规则:

WhiteSpaces : [ \t]+;
Newlines    : [\r\n]+;
Commnent    : '*' .*? Newlines -> skip ;
SkipTokens  : (WhiteSpaces | Newlines) -> skip;

例如:

* this is a comment line
** another comment line
*+ type value

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

共有1个答案

公冶弘壮
2023-03-14

将永远不会匹配您的SkipTokenslexer规则,因为规则空格和新行都放在它前面。参见此Q

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

SkipTokens  : (WhiteSpaces | Newlines) -> skip;

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

什么是片段,检查这个Q

现在,回答你的问题。您定义了一条注释规则,使其始终以换行符结束。这意味着在输入的末尾不能有注释。因此,您应该让注释以换行符或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
 ;

当然,这并不要求将*置于行的开头。如果需要,请签出此Q

 类似资料:
  • 问题内容: 我有一个JSON文件,我正在尝试处理,但出现以下错误: 线程“主” org.json.JSONException中的异常:JSONObject文本必须在org.json.JSONObject的org.json.JSONTokener.syntaxError(JSONTokener.java:433)的1 [字符2行1]处以“ {”开头。(JSONObject.java:195)位于or

  • 我试图编写一个简单的复数计算器,可以计算以下表达式: 输入1:(10 30i)(90 20i) 预期输出:(100 50i) 输入2:(10 30i)-(90 20i) 预期输出:(-80 10i) 编辑:我注意到第一次前瞻读取是10而不是40(ascii值 '(' ) . 我如何解决这个问题? 我的代码: 但它总是输出“对不起,我帮不了你。”

  • 我在一个项目中工作,那里给了我一个允许的字符列表,并要求我删除不需要的字符。我已经完成了以下工作,但我觉得它很麻烦,而且超出了应有的范围 在测试启动条件时,我添加了三个检查。contains检查为空字符串大小写返回true,因此我添加了字符串长度条件,以便为空字符串大小写返回NULL。 我用于测试的XML如下 我可能遗漏了任何边缘情况,我的问题是,有没有更好的方法来解决起始字符和连续字符是有条件的

  • 我正在写一个程序,必须解码二维码。代码在内部表示为二维布尔列表。代码通常被读取为包含1和0的文本文件,其中1表示矩阵中的暗模块(true),0表示亮模块(false)。 我必须实现一个方法,它将接受一个输入流,然后必须返回一个QR码。我必须读. txt,它包含1、0和以“#”开头的注释行。我需要使该方法忽略这些注释行,但我不知道如何做到这一点。 以下是代码的一些相关部分: 首先QR码构造函数(构造

  • 问题内容: 我有一个看起来像这样的字符串: 我如何删除第一个; 但只有在字符串的开头找到它? 使用,将删除 所有 。 问题答案: 普通格式,不带正则表达式: 花费: 0.0369毫秒 (0.000,036,954秒) 与: 注意到: 0.1749毫秒 (0.000,174,999秒)第一次运行(编译),和 0.0510毫秒 (0.000,051,021秒)之后。 显然,已在我的服务器上进行了分析。