2014-03-28 96 views
0

目前有我的一些語法解析的問題,我只是無法弄清楚什麼錯誤..沒有可行的輸入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的第一語法規則應該工作,但它不...

下面是錯誤antlrs 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 ')' 

感謝您的幫助! Tim

+0

我不知道發生了什麼,但是我使用ANTLR 4.1(僅適用於我的版本)可以使用您的語法和解析輸入而不會出錯。你碰巧在你的類路徑中有多個版本的ANTLR嗎? –

+0

你是從文件加載樣本,也許有一些UTF BOM?也許你可以發佈原始文件而不是粘貼其內容。 – Onur

回答

0

當我看到這樣一個奇怪的無意義的bugaboo時,它通常意味着詞法分析器和分析器認爲這些令牌類型之間存在令牌不匹配。確保使用ANTLR重新生成所有語法並重新編譯所有內容。希望這將清除它。

+0

已經重新編譯和重新生成了近20次......這個問題真的很煩人! – schneiti

+0

好吧,我只是用grun試過。在這個輸入上完美地工作。 (程序(functionList(function haupt(){(stmntList(stmnt zahl zz;))(stmntList(stmnt zz =(expr(product(factor 2)))) ;)(stmntList(stmnt zahl cc;)(stmntList(stmnt cc =(expr(product(factor 3)));)(stmntList(stmnt zz =(expr(expr(product(factor zz)))+(product因子cc)));)(stmntList(stmnt Schreibe(expr(expr(expr(product(factor cc)))+(product(factor cc)))+(product(factor cc))));))) ))))}))) ''' –

相關問題