我必须在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(