在ANTLR4中正确捕获未闭合的字符串



我必须在ANTLR4中定义字符串文字,并捕获UNCLOSE_string异常。

字符串被一对"和可能支持转义:

b f r n t ’ \

"出现在字符串中的唯一方法是附加CCD_ 3("(。

我尝试了各种方法来定义字符串文字,但都被UNCLOSE_string:所吸引

program: global_variable_part function_declaration_part EOF;
<!-- Shenanigans of statements ...-->
fragment Character: ~( [bfrnt"\] | ''') | Escape | ''"';
fragment Escape: '\' ( 'b' | 'f' | 'r' | 'n' | 't' | ''' | '\');
fragment IllegalEscape: '\' ~( 'b' | 'f' | 'r' | 'n' | 't' | ''' | '\') ;
STR_LIT: '"' Character* '"' {
content = str(self.text)
self.text = content[1:-1]
};
UNCLOSE_STRING: '"' Character* ([bfrnt\] | EOF) {
esc = ['b', 't', 'n', 'f', 'r', '\']
content = str(self.text)
raise UncloseString(content)
};

例如CCD_ 4将匹配,但仅产生CCD_。

这与Java中的字符串规范非常接近。不要害怕";借用";来自其他语法。我对Java Lexer规则的轻微修改(我认为(符合您的需求:

StringLiteral
:   '"' StringCharacters? '"'
;
fragment
StringCharacters
:   StringCharacter+
;
fragment
StringCharacter
:   ~["\rn]
|   EscapeSequence
;
fragment
EscapeSequence
:   '\' [btnfr'\]
:   "'""  // <-- the '" escape match
;

如果你知道另一种更匹配的语言,你可以在这里查看它是如何处理的,以查找它的语法(ANTLR4 Grammars(

相关内容

  • 没有找到相关文章

最新更新