2011-12-03 85 views
0

我試圖建立一個與野牛解析器,並已將我的所有錯誤縮小到一個困難的。野牛:衝突:1移位/減少錯誤

下面是與國家野牛的調試輸出,其中的錯誤在於:

state 120 

    12 statement_list: statement_list . SEMICOLON statement 
    24 if_statement: IF conditional THEN statement_lists ELSE statement_list . 

    SEMICOLON shift, and go to state 50 

    SEMICOLON [reduce using rule 24 (if_statement)] 
    $default reduce using rule 24 (if_statement) 

這裏是在parser.y源

%% 

program    : ID COLON block ENDP ID POINT 
        ; 
block    : CODE statement_list 
        | DECLARATIONS declaration_block CODE statement_list 
        ; 
declaration_block : id_list OF TYPE type SEMICOLON 
        | declaration_block id_list OF TYPE type SEMICOLON 
        ; 
id_list    : ID 
        | ID COMMA id_list 
        ; 
type     : CHARACTER 
        | INTEGER 
        | REAL 
        ; 
statement_list  : statement 
        | statement_list SEMICOLON statement 
        ; 
statement_lists  : statement 
        | statement_list SEMICOLON statement 
        ; 
statement   : assignment_statement 
        | if_statement 
        | do_statement 
        | while_statement 
        | for_statement 
        | write_statement 
        | read_statement 
        ; 
assignment_statement : expression OUTPUTTO ID 
        ; 
if_statement   : IF conditional THEN statement_lists ENDIF 
        | IF conditional THEN statement_lists ELSE statement_list 
        ; 
do_statement   : DO statement_list WHILE conditional ENDDO 
        ; 
while_statement  : WHILE conditional DO statement_list ENDWHILE 
        ; 
for_statement  : FOR ID IS expression BY expressions TO expression DO statement_list ENDFOR 
        ; 
write_statement  : WRITE BRA output_list KET 
        | NEWLINE 
        ; 
read_statement  : READ BRA ID KET 
        ; 
output_list   : value 
        | value COMMA output_list 
        ; 
condition   : expression comparator expression 
        ; 
conditional   : condition 
        | NOT conditional 
        | condition AND conditional 
        | condition OR conditional 
        ; 
comparator   : ASSIGNMENT 
        | BETWEEN 
        | LT 
        | GT 
        | LESSEQUAL 
        | GREATEREQUAL 
        ; 
expression   : term 
        | term PLUS expression 
        | term MINUS expression 
        ; 
expressions   : term 
        | term PLUS expressions 
        | term MINUS expressions 
        ; 
term     : value 
        | value MULTIPLY term 
        | value DIVIDE term 
        ; 
value    : ID 
        | constant 
        | BRA expression KET 
        ; 
constant    : number_constant 
        | CHARCONST 
        ; 
number_constant  : NUMBER 
        | MINUS NUMBER 
        | NUMBER POINT NUMBER 
        | MINUS NUMBER POINT NUMBER 
        ;    
%% 

翻譯規則,當我刪除了if_statement規則有沒有錯誤,所以我已經將其縮小了很多,但仍然無法解決錯誤。

感謝您的任何幫助。

+0

你的語法怎麼沒有結束,if-else與endif如同所有其他這樣的結構一樣? – Hobblin

+0

另外,我不確定,但我想我已經解決類​​似的問題,指定一個特殊的「else_statement」,可以是「else語句」或空,並指定如果「如果statment else_statement」 – Hobblin

+0

謝謝很多。不能相信我錯過了:) – Lee

回答

3

請考慮以下語句:if condition then s2 else s3; S4

有兩種解釋:

if condition then 
    s1; 
else 
    s2; 
s3; 

另一種是:

if condition then 
    s1; 
else 
    s2; 
    s3; 

在第一位的,statment名單是由一個if聲明和s3的。而其他陳述僅由一個if陳述組成。這就是歧義的來源。當存在移位減少衝突時,Bison更喜歡移位,因此在上述情況下,解析器將選擇移位s3

由於您在if-then聲明中有ENDIF,請考慮在您的if-then-else聲明中引入ENDIF,然後問題就解決了。

+0

感謝您指出! – Lee

2

我認爲您在IF-THEN-ELSE-ENDIF規則中缺少ENDIF

+0

感謝您的回答 – Lee