我有一个ANTLR语法文件,字符串定义如下
STRING
: '"' (EscapeSequence | ~('\\'|'"') )* '"' ;
fragment EscapeSequence
: '\\' .
;
但是这个Lexer规则忽略了引号的第一个实例中的转义字符。
id \ = \“
被识别为字符串的开头,而前面有一个转义字符。这只发生在第一个引用。如果转义,所有后续引号都会被正确识别。
/ id \ = \“Testing \” - 不应该是字符串,因为两个引号都被转义了 / id \ = “测试” - 应该是引号之间的字符串,因为它们不会被转义
要解决的主要问题是,如果引号前面的字符(仅最后一个字符)是转义字符,则要避免词法分析器尝试识别字符串。如果有多个转义字符,我需要在起始引号之前只考虑一个字符。
答案 0 :(得分:0)
ANTLR会在几乎所有情况下自动提供您所需的行为。请考虑以下输入:
/id\=\"Testing\"
关键要求涉及第一个引号字符前面的令牌的位置和长度。在下面的块中,我仅添加空格以说明字符之间出现的条件。
/ i d \ = \ " T e s t i n g \ "
^
|
----------- Make sure no token can *end* here
通过确保第一个"
字符作为令牌的一部分而包含在其中的\
字符,您可以确保第一个"
字符永远不会被解释为STRING
令牌的开头。
如果不满足上述条件,您的"
字符 将被视为STRING
令牌的开头。