ANTLR解析字符串(空格保留),并解析正常标识符(ANTLR parse strings (kee

2019-10-30 06:20发布

我试图用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”。我不知道我做错了什么。

Answer 1:

您STRING规则将匹配任何报价,但这样将丝巾任何事情。 这是太宽松。 你需要从别人我认为STRING什么区别一个更严格的定义。 一旦它在〜““” *它将围巾,直到'”。



Answer 2:

是的,有这个语法问题。 令牌STRING配衬 '测试\ nHelloWorld \ n'。 它将把一切都放在这个道理,但没有规则,只需在标记字符串。

想想改变标记字符串。



文章来源: ANTLR parse strings (keep whitespaces) and parse normal identifiers
标签: antlr