无法分析Antlr整数

无法分析Antlr整数,antlr,antlr4,Antlr,Antlr4,我在ANTLR 4中创建了以下语法: grammar SIL; @header { package simpleinterpretivelanguage; import java.util.HashMap; import java.util.Scanner; } @lexer::header { package simpleinterpretivelanguage; } @members { HashMap memory = new HashMap(

我在ANTLR 4中创建了以下语法:

grammar SIL;

@header {
    package simpleinterpretivelanguage;
    import java.util.HashMap;
    import java.util.Scanner;
}

@lexer::header {
    package simpleinterpretivelanguage;
}

@members {
    HashMap memory = new HashMap();
}

prog:   stat+ ;

stat    :   COMMENT NEWLINE
    |   'PRINT' print NEWLINE
    |   'PRINTLN' {System.out.println();} print  NEWLINE
    |   'INTEGER' integer NEWLINE
    |   'INPUT' input NEWLINE
    |   'LET' let NEWLINE
    |   'END' { System.exit(0); } 
    ;

print   :   expr {System.out.print($expr.value);}
    |   STRING {System.out.print($STRING.text);}
    ;

integer :   identifier (',' identifier)*    
    ;

identifier
    :   ID 
        {
            Integer v = (Integer)memory.get($ID.text);
            if ( v==null ){
                memory.put($ID.text,new Integer(0));
            }
            else{
                System.err.println("Duplicate INTEGER : "+$ID.text);
            }
        }
    ;

let :   ID '=' expr 
        {
            Integer v = (Integer)memory.get($ID.text);
            if ( v!=null ){
                memory.put($ID.text, new Integer($expr.value));
            }
            else{
                System.err.println("Undefined variable "+$ID.text);
            }
        }
    ;

input   :   inputidentifier (',' inputidentifier)*
    ;

inputidentifier
    :   ID 
        {
            Integer v = (Integer)memory.get($ID.text);
            if ( v!=null ){
                Scanner scanner = new Scanner(System.in);
                System.out.println("Enter value for "+$ID.text+" : ");
                Integer val = scanner.nextInt();
                memory.put($ID.text,val);
            }
            else{
                System.err.println("Undefined variable "+$ID.text);
            }
        }   
    ;

expr returns [int value]
    :   e=multExpr {$value = $e.value;}
        (   '+' e=multExpr {$value += $e.value;}
        |   '-' e=multExpr {$value -= $e.value;}
        )*
    ;

multExpr returns [int value]
    :   e=atom {$value = $e.value;} 
        (   '*' e=atom {$value *= $e.value;}
        |   '/' e=atom {$value /= $e.value;}
        )*
    ; 

atom returns [int value]
    :   INT {$value = Integer.parseInt($INT.text);}
    |   ID
        {
        Integer v = (Integer)memory.get($ID.text);
        if ( v!=null ) $value = v.intValue();
        else System.err.println("Undefined variable "+$ID.text);
        }
    |   '(' e=expr ')' {$value = $e.value;}
    ;

ID  :   ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;

INT :   '0'..'9'+ ;

NEWLINE:'\r'? '\n' ;

WS  :   (' '|'\t')+ {skip();} ;

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

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
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;
当我尝试解析此内容时:

INTEGER A, B, C
LET A=2+3*4
PRINT A
LET A=(2+3)*4
PRINT A
LET A=(4+8)/2
PRINTLN A
INPUT A, B, C
PRINTLN A*B*C
END
在我的搜索之后,我尝试了很多东西,但没有任何效果。我仍然得到这个错误:

line 1:0 no viable alternative at character 'I'
line 1:1 required (...)+ loop did not match anything at input 'NTEGER'
line 2:0 no viable alternative at character 'L'
line 2:1 no viable alternative at character 'E'
line 2:5 no viable alternative at character '='
line 4:0 no viable alternative at character 'L'
line 4:1 no viable alternative at character 'E'
line 4:5 no viable alternative at character '='
line 6:0 no viable alternative at character 'L'
line 6:1 no viable alternative at character 'E'
line 6:5 no viable alternative at character '='
line 8:0 no viable alternative at character 'I'
line 10:0 no viable alternative at character 'E'
它似乎不理解INTEGER和let,但理解print和println的长度和操作数一样长。我将EclipseNeon与antlr-4.0-complete.jar一起使用


感谢您的帮助

您的lexer无法标记任何关键字。例如,您已经定义了语法符号INTEGER,但是lexer中没有任何东西可以解析为名为INTEGER的标记。LET也是如此。你的lexer从LE“T”中识别出“T”,因为“T”属于ID(最有可能),而“LET”作为一个整体是没有意义的。非常感谢你的快速回复。我怎么能加上这个?我在lexer中添加了一个东西:public final void mT_uu24()抛出识别异常{try{int_utype=T_u24;int_uchannel=DEFAULT_utoken_uchannel;{match(“INTEGER”);}state.type=\u type;state.channel=\u channel;}最后{}我的建议是:使用最新的Antl4版本(4.7 atm)并打印您的lexer识别的所有令牌(请参见
lexer.getTokens()
),以查看哪些lexer规则未按预期工作。