我有一个 ANTLR 语法文件,其字符串定义如下
STRING
: '"' (EscapeSequence | ~('\\'|'"') )* '"' ;
fragment EscapeSequence
: '\\' .
;
但是这个 Lexer 规则忽略了引号的第一个实例中的转义字符。这
身份证\=\"
被识别为字符串的开头,而前面有一个转义字符。这仅发生在第一个报价中。所有后续引号,如果转义,都可以正确识别。
/id\= \"Testing\" -- 不应该是字符串,因为两个引号都被转义了
/id\= "Testing" -- 应该是引号之间的字符串,因为它们没有被转义
要解决的主要问题是,如果引号前面的字符(仅最后一个字符)是转义字符,则要避免词法分析器尝试识别字符串。如果有多个转义字符,我只需要在起始引号之前考虑一个字符。