Antlr4 Antlr-如果Lexer标记被分配给语法中的另一个标记,则无法使用它

Antlr4 Antlr-如果Lexer标记被分配给语法中的另一个标记,则无法使用它,antlr4,Antlr4,我使用的是antlr-4.2-antlr的完整版本。 我无法理解确切的问题 更新: 我给出的输入像MID(9)问题是您的规则不明确。“9”应该是什么?它可以是字符串或and INT。我强烈建议使用antlr社区提供的字符串、WS、COMMENT和换行符的预定义文本 请注意,这是antlr3代码正如你所看到的,字符串是引号中的某物(我想这也是你想要的) 我不确定我是否理解你的意思,我只使用了antlr3,但如果你想验证MID,我很确定你不应该把它放在“引号”中。请发布一个你作为输入和预期结果的例子

我使用的是antlr-4.2-antlr的完整版本。 我无法理解确切的问题

更新:


我给出的输入像MID(9)

问题是您的规则不明确。“9”应该是什么?它可以是字符串或and INT。我强烈建议使用antlr社区提供的字符串、WS、COMMENT和换行符的预定义文本

请注意,这是antlr3代码正如你所看到的,字符串是引号中的某物(我想这也是你想要的)


我不确定我是否理解你的意思,我只使用了antlr3,但如果你想验证MID,我很确定你不应该把它放在“引号”中。请发布一个你作为输入和预期结果的例子谢谢!!我像MID(9)一样输入,如果我把“VALUE:INT;”改为VALUE:INT | STRING;那么上面的代码也不起作用了。所以,我必须在MID中输入值,比如'MID('int_val=VALUE'),或者如果我想输入int,那么我必须删除或注释“VALUE:int | STRING;”语句。就我理解您的需求而言,我认为您希望能够解析MID(9)和MID(“9”),对吗?其他任何事情对我来说都没有意义。因此,lexer规则的主要问题是,您的“字符串”不包含引号,因此解析器无法决定9是应解释为字符串还是int。如果我的答案解决了您的问题,请将其标记为已解决。泰
"In this example if i use 'MID('int = VALUE')' then it works fine. I want MID to be validated for INT value but when i use INT it gives error "mismatched input '9' expecting INT.
grammar DIExpression;

r: 'MID('int_val = INT')'
    {
        System.out.println("value equals: "+ $int_val.text); 
    };

VALUE : INT | STRING;
STRING : [0-9a-zA-Z_]+;
INT : [0-9]+;
WS : [ \t\r\n]+ -> skip ;
INT :   '0'..'9'+
    ;

FLOAT
    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
    |   '.' ('0'..'9')+ EXPONENT?
    |   ('0'..'9')+ EXPONENT
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

CHAR:  '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
    ;

fragment
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;