[英]Properly catching an unclosed string in ANTLR4
我必須在 ANTLR4 中定義字符串文字並捕獲 UNCLOSE_STRING 異常。
字符串由一對 "" 包圍,並且可能支持轉義:
\\b \\f \\r \\n \\t \\' \\\\
"
出現在字符串中的唯一方法是附加一個'
('")。
我嘗試了各種方法來定義字符串文字,但它們都被 UNCLOSE_STRING 捕獲:
program: global_variable_part function_declaration_part EOF;
<!-- Shenanigans of statements ...-->
fragment Character: ~( [\b\f\r\n\t"\\] | '\'') | 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* ([\b\f\r\n\t\\] | EOF) {
esc = ['\b', '\t', '\n', '\f', '\r', '\\']
content = str(self.text)
raise UncloseString(content)
};
例如, "ab'"c\\\\n def"
將匹配,但只生成未Unclosed String: ab'"c\\n def"
。
這與 Java 中的字符串規范非常接近。 不要害怕“借用”其他語法。 我對(我認為)符合您需求的Java Lexer 規則稍作修改:
StringLiteral
: '"' StringCharacters? '"'
;
fragment
StringCharacters
: StringCharacter+
;
fragment
StringCharacter
: ~["\\\r\n]
| EscapeSequence
;
fragment
EscapeSequence
: '\\' [btnfr'\\]
: "\'"" // <-- the '" escape match
;
如果您知道另一種更接近匹配的語言,您可以在此處查看它是如何處理的以查找其語法( ANTLR4 Grammars )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.