我正在使用 antlr4 C++运行时,我想在我的词法分析器定义文件中创建一个字符串文字。我该怎么做?
到目前为止,我拥有的:
V_STRING : '"' ~('\' | '"')* '"';
我不工作
printf("string literaln");
但适用于
printf("string literal\n");
我不想明确转义换行符。
我的假设是 Antlr 将换行符解释为常规新行(例如,在读取文件时)。
提前谢谢。
列出您的令牌流以查看您的词法分析器规则是否真的符合您的期望总是一个好主意。 (查看TestRig
的tokens
选项;此外,一些插件会向您显示您的令牌)
在您的情况下,您的规则本质上是字符串是"一个"
后跟 0 个或多个不是或
"
的字符,然后是"
"。
因此,当 Lexer 遇到您的时,匹配规则的
~('\\'|'")*
部分,然后寻找"
(它没有找到,因为后跟一个
n
),所以它不会将"string literaln"
识别为V_STRING
令牌(它也无法匹配"string literal\n"
, 在这里,所以我不太确定"有效"的示例是怎么回事)。
尝试:
V_STRING: '"' ~["]* '"';
注意:这是一个非常简单的字符串规则,但它接受您的输入。您可能希望检查其他语言的语法,以了解您可能希望如何处理语言中的字符串;有几种方法(其中许多涉及使用词法分析器模式)。你可以在这里找到例子)
如果您希望将""视为换行符,只需了解解析器不会为您执行此操作,您只会看到字符"和"n"。由您来处理转义字符的编码(一旦您尝试处理",它将变得更加复杂,您需要研究词法分析器模式)