没有可行的输入ANTLR4

时间:2014-03-28 23:45:51

标签: parsing antlr antlr4

目前我的语法有一些解析问题,我只是无法弄清楚出了什么问题..

这是我的语法:

grammar Demo;

@header {
    import java.util.List;
    import java.util.ArrayList;
}

program:
    functionList                                                                #programFunction
    ;

functionList:
    function*
    ;

function:
    'haupt()' '{' stmntList '}'                                                     #hauptFunction
    | type='zahl' ID '(' paramList ')' '{' stmntList '}'                            #zahlFunction
    | type='Zeichenkette' ID '(' paramList ')' '{' stmntList '}'                    #zeichenketteFunction
    | type='nix' ID '(' paramList ')' '{' stmntList '}'                             #nixFunction
    ;

paramList:
    param (',' paramList)?
    ;

param:
    'zahl' ID                                       
    | 'Zeichenkette' ID     
    |                                   
    ;

variableList:
    ID (',' variableList)?
    ;


stmntList:
    stmnt (stmntList)?                                      
    ;

stmnt:
    'zahl' varName=ID ';'                                                               #zahlStmnt
    | 'Zeichenkette' varName=ID ';'                                                     #zeichenketteStmnt
    |  varName=ID '=' varValue=expr ';'                                                 #varAssignment
    | 'Schreibe' '(' argument=expr ')' ';'                                  #schreibeImmediat 
    | 'Schreibe''(' argument=ID ')'     ';'                                     #schreibeText
    | 'zuZeichenkette' '(' ID ')'';'                                            #convertString
    | 'zuZahl''('ID')'';'                                                       #convertInteger
    | 'wenn' '(' boolExpr ')' '{' stmntList '}'  ('sonst' '{' stmntList '}')?   #wennsonstStmnt 
    | 'fuer' '(' ID '=' expr ',' boolExpr ',' stmnt ')' '{' stmntList '}'       #forLoop    
    | 'waehrend' '(' boolExpr ')' '{' stmntList '}'                             #whileLoop
    | 'tu' '{' stmntList '}' 'waehrend' '(' boolExpr ')'    ';'                     #doWhile
    | 'return' expr             ';'                                             #returnVar
    | fctName=ID '(' (variableList)? ')'';'                                     #functionCall               
    ;

boolExpr:
    boolParts ('&&' boolExpr)?                                                  #logicAnd
    | boolParts ('||' boolExpr)?                                                #logicOr
    ;

boolParts:
    expr '==' expr                                                              #isEqual
    | expr '!=' expr                                                            #isUnequal
    | expr '>' expr                                                             #biggerThan
    | expr '<' expr                                                             #smallerThan
    | expr '>=' expr                                                            #biggerEqual
    | expr '<=' expr                                                            #smallerEqual
    ;

expr:
    links=expr '+' rechts=product                   #addi
    | links = expr '-' rechts=product               #diff
    |product                            #prod
    ;

product:
    links=product '*' rechts=factor                 #mult
    | links=product '/' rechts=factor               #teil
    | factor                            #fact
    ;

factor:
    '(' expr')'                         #bracket
    | var=ID                                #var
    | zahl=NUMBER                           #numb
    ;


ID  :       [a-zA-Z]+;
NUMBER  :   '0'|[1-9][0-9]*;
WS:         [\r\n\t ]+ -> skip ;

这是我要解析的代码:

haupt() {
    zahl zz; 
    zz = 2;
    zahl cc;
    cc = 3;

    zz = zz+cc;
    Schreibe(cc+cc+cc);     
}   

问题出现在第一行,告诉我它需要'{'而不是''。这是我无法理解的,因为我在语法中跳过了所有WS。接下来的错误是对第二行的错误识别:“zahl zz”的变量声明不应该被理解为:stmnt的第一个语法规则应该有效,但它没有......

以下是Antrrs TestRig给我的错误:

line 2:6 no viable alternative at input 'zahlzz'
line 4:6 no viable alternative at input 'zahlcc'
line 9:12 mismatched input '+' expecting ')'

感谢您的帮助! 添

1 个答案:

答案 0 :(得分:0)

当我看到像这样奇怪的荒谬的bugaboo时,它通常意味着词法分析器和解析器认为令牌类型之间存在令牌不匹配。确保使用ANTLR重新生成所有语法并重新编译所有内容。希望这会清除它。