2014-03-25 51 views
0

我被困我compilerproject的大學和有麻煩解析下面輸入不匹配的輸入antlr4曲解

haupt() { 
    while(i==2) { 
     (5+2)*3 
     } 
} 

這個語法:

grammar Demo; 

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

program: 
    functionList 
    ; 

functionList: 
    function* 
    ; 

function: 
    'haupt()' '{' stmntList '}'     #haupt 
    |'Integer' ID '(' paramList ')' '{' stmntList '}' #integerFunction 
    | 'String' ID '(' paramList ')' '{' stmntList '}' #stringFunction 
    | 'void' ID '(' paramList ')' '{' stmntList '}'  #voidFunction 
    ; 

paramList: 
    param (',' paramList)? 
    ; 

param: 
    'Integer' ID           
    | 'String' ID          
    ; 

variableList: 
    ID (',' variableList)? 
    ; 


stmntList: 
    stmnt (stmntList)?          
    ; 

stmnt: 
    'Integer' ID ';'              #integerStmnt 
    | 'String' ID ';'              #stringStmnt 
    | ID '=' expr ';'              #varAssignment 
    | 'print''(' ID ')'  ';'            #printText 
    | 'toString' '(' ID ')'';'            #convertString 
    | 'toInteger''('ID')'';'            #convertInteger 
    | 'if' '(' boolExpr ')' '{' stmntList '}' ('else' '{' stmntList '}')? #elseStmnt 
    | 'for' '(' ID '=' expr ',' boolExpr ',' stmnt ')' '{' stmntList '}' #forLoop  
    | 'while' '(' boolExpr ')' '{' stmntList '}'       #whileLoop 
    | 'do' '{' stmntList '}' 'while' '(' boolExpr ')' ';'     #doWhile 
    | 'return' expr    ';'           #returnVar 
    | 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 
    | ID        #var 
    | zahl=NUMBER       #numb 
    ; 


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

因爲我收到以下錯誤信息:

line 1:5: mismatched input '(' expecting {<EOF>, '-', '*', '+', '/'} 

我認爲antlr誤解了輸入並認爲「haupt」是一個ID我而不是第一個功能規則。這怎麼會發生?我一直認爲antlr使用第一個規則匹配?

感謝您的幫助!

+0

我不知道這是否是你的問題,但我有從來沒有見過一個語法befor e括號是關鍵字的一部分,如'haupt()'中所示,同時也可以在其他地方作爲單獨的標記使用。也許試試'haupt''('')'而不是'haupt()'? –

回答

1

我會按照建議使用'haupt''('')',但'haupt()'應該匹配。事實上,它確實如此。我得到的錯誤是第3行。聲明中沒有任何內容匹配(5 + 2)* 3。

0

我得到一個不同的錯誤:

line 3:8 no viable alternative at input '(' 

,我可以解釋一下:(5 + 2)* 3是沒有聲明(如泰爾已經指出的那樣)。

你似乎使用ANTLR的一個奇怪的版本...

你還應該注意的警告:

warning(146): Path\To\File\Demo.g4:95:0: non-fragment lexer rule 'ID' can match the empty string 

這告訴你的是,空字符串也將是一個標識符(其在大多數情況下不是你想要的)。更改*+幫助...

+0

試過這個,但ID似乎沒有引起這個問題。任何人都知道爲什麼ANTLR使用#functioncall而不是stmnt的#printText規則? – schneiti

+0

您的發佈示例中沒有打印。 – Onur

0

關於你comment

它工作正常,我(請注意,ID規則已略有從你的版本改變,但它也可以與您的版本)。

如果你看一看令牌類型(在<>的數字),你會看到類型printabc(即一個ID)是不同的(17('print')和33(ID))。

語法:

grammar Demo; 

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

program: 
    functionList 
    ; 

functionList: 
    function* 
    ; 

function: 
    'haupt()' '{' stmntList '}'     #haupt 
    |'Integer' ID '(' paramList ')' '{' stmntList '}' #integerFunction 
    | 'String' ID '(' paramList ')' '{' stmntList '}' #stringFunction 
    | 'void' ID '(' paramList ')' '{' stmntList '}'  #voidFunction 
    ; 

paramList: 
    param (',' paramList)? 
    ; 

param: 
    'Integer' ID 
    | 'String' ID 
    ; 

variableList: 
    ID (',' variableList)? 
    ; 


stmntList: 
    stmnt (stmntList)? 
    ; 

stmnt: 
    'Integer' ID ';'              #integerStmnt 
    | 'String' ID ';'              #stringStmnt 
    | ID '=' expr ';'              #varAssignment 
    | 'print''(' ID ')'  ';'            #printText 
    | 'toString' '(' ID ')'';'            #convertString 
    | 'toInteger''('ID')'';'            #convertInteger 
    | 'if' '(' boolExpr ')' '{' stmntList '}' ('else' '{' stmntList '}')? #elseStmnt 
    | 'for' '(' ID '=' expr ',' boolExpr ',' stmnt ')' '{' stmntList '}' #forLoop 
    | 'while' '(' boolExpr ')' '{' stmntList '}'       #whileLoop 
    | 'do' '{' stmntList '}' 'while' '(' boolExpr ')' ';'     #doWhile 
    | 'return' expr    ';'           #returnVar 
    | 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 
    | ID        #var 
    | zahl=NUMBER       #numb 
    ; 


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

測試文件:

haupt() { 
    while(i==2) { 
     print(abc); 
     } 
} 

結果:

[@0,0:6='haupt()',<18>,1:0] 
[@1,8:8='{',<9>,1:8] 
[@2,14:18='while',<6>,2:4] 
[@3,19:19='(',<20>,2:9] 
[@4,20:20='i',<33>,2:10] 
[@5,21:22='==',<25>,2:11] 
[@6,23:23='2',<34>,2:13] 
[@7,24:24=')',<30>,2:14] 
[@8,26:26='{',<9>,2:16] 
[@9,36:40='print',<17>,3:8] 
[@10,41:41='(',<20>,3:13] 
[@11,42:44='abc',<33>,3:14] 
[@12,45:45=')',<30>,3:17] 
[@13,46:46=';',<7>,3:18] 
[@14,56:56='}',<13>,4:8] 
[@15,58:58='}',<13>,5:0] 
[@16,59:58='<EOF>',<-1>,5:1] 
(program (functionList (function haupt() { (stmntList (stmnt while ((boolExpr (boolParts (expr (product (factor i))) == (expr (product (factor 2)))))) { (stmntList (stmnt print (abc) ;)) })) }))) 

Parse tree