STRING: '"' -> pushMode(STRING_MODE);
mode STRING_MODE;
STRING_CONTENTS: ~('"'|'\n'|'\r')+ -> type(STRING);
END_STRING: '"' -> type(STRING), popMode;
STRING_UNMATCHED: . -> type(UNMATCHED);
我知道我也可以像这样编写字符串标记:
STRING: '"' (~["\n\r]|'\\"')* '"';
1)more
属性将匹配的文本累加到非more
属性化规则发出的第一个标记中。
对于:
STRING: '"' -> more, pushMode(STRING_MODE);
mode STRING_MODE;
STRING_CONTENTS: ~('"'|'\n'|'\r')+ -> more ;
END_STRING: '"' -> type(STRING), popMode;
与String
和String_Contents
规则匹配的文本被前置到End_String
规则的文本,从而产生一个String
类型的标记,该标记包含字符串的全文。
如何实现这些模式?
我正在使用antlr4语法存储库中的JSON语法为编辑器插件解析JSON文件。它可以工作,但逐个报告无效字符。以下片段导致18个lexer错误: 我想通过将相同类型的连续的、无效的单字符令牌作为一个更大的无效令牌来处理,将其缩减为1-2。 对于一个类似的问题,有人建议使用一个自定义的lexer将“未知”元素粘附到较大的令牌上:在antlr4 lexer中,如何有一个规则来捕获所有剩余的“单词”作为
我不熟悉词法分析,如果标题不够清晰,我很抱歉。 基本上,我使用Jison来解析一些文本,并试图让lexer理解缩进。这里有一点值得商榷: 到目前为止,几乎所有这些都像预期的那样工作。一个问题是我试图返回一个令牌数组的行。看来Jison只是将该数组转换成一个字符串,这导致我得到一个解析错误,如。 我希望我能做的是手动将一些令牌推到堆栈上。也许有一个像或类似的东西。但是Jison的文档不是很好,我需要
我试图使用ANTLR4创建一个简单的解析器,但我在识别lexer令牌方面遇到了问题。问题是,即使单词SAYS后面有一个“:”,解析器规则也不能识别它。而且对于提及,@Michael也没有被识别出来。 输入的文本是:john说:hello@Michael这将不起作用 //LEXER规则
关于antlr4的几个问题使用了书中没有提到的lexer谓词,例如28730446使用了head(String),42058127使用了getCharPositionInLine(),23465358使用了_input.la(1)等。是否有可用的lexer谓词列表及其文档?
所有:我正在尝试编写一个antlr解析器来解析一些文本,这些文本的格式如下: 基本上,所有行都有一个前导来指示一行文本的用途,最后一行应该以结尾,以指示这类行的结尾。文本也可以是任何东西。最后我需要的是文本。 我为此写了一个Antlr语法: 这里的思想是,当看到第一个RP_HEADER时,它会更改为RP_FREE_TEXT_MODE并因此跳过行间的任何RP_HEADER。当看到DOT_NEWLIN