我试图用ANTLR4解析源文件。 有一件事我需要做的是一个字符串文字包含了各种人物和可能的白色空间,而正常的标识符中只包含英文字母和数字(空格都扔掉了)。
我用下面的ANTLR语法规则(最小的例子),但预期它不工作。
grammar parseString;
rules
: stringRule+
;
stringRule
: formatString
| idString
;
formatString
: STRING_DOUBLEQUOTE STRING STRING_DOUBLEQUOTE
;
idString
: (NONTERM | TERM)
;
// LEXER
STRING_DOUBLEQUOTE
: '"' ;
DIGITS
: DIGIT+
;
TERM
: UPPERCHAR CHAR+
;
NONTERM
: LOWERCHAR CHAR+
;
fragment
CHAR
: LOWERCHAR
| UPPERCHAR
| DIGIT
| '-'
| '_'
;
fragment
DIGIT
: [0-9]
;
fragment
LOWERCHAR
: [a-z]
;
fragment
UPPERCHAR
: [A-Z]
;
WS
: (' ' | '\t' | '\r' | '\n')+ -> skip
; // skip spaces, tabs, newlines
LINE_COMMENT
: '//' ~[\r\n]* -> skip
;
STRING
: ~('"')*
;
对于我使用的测试案例,
Test
HelloWorld
"$this is a string"
"*this is another string!"
我得到的错误line 1:0 extraneous input 'Test\nHelloWorld\n' expecting {'"', TERM, NONTERM}
和‘formatString中’的最后两行被正确解析,但对于前两行,因为该换行符(“\ n”)没有得到扔掉,因此它们不匹配“idString”。我不知道我做错了什么。