簡體   English   中英

我與CUP發生Shift / Reduce沖突

[英]I am getting a Shift/Reduce conflict with CUP

我有以下解析代碼,但是在非終端表達式和function_call之間卻出現了shift / reduce沖突。 這是Visual Basic編程語言的簡短解析代碼。 CFG會錯嗎? 或僅在這兩個非終端符號中存在問題。

program ::= function_declarations:functionDeclarations
            | /* Vacio */
;


function_declarations ::= function_declaration:functionDeclaration function_declarations:functionDeclarations
;

function_declaration ::= structure_statement:structureStatement
             |sub_statement:subStatement
             |function_statement:functionStatement
;

structure_statement ::= TK_STRUCTURE TK_ID statements:stmnts TK_END TK_STRUCTURE
;

sub_statement ::= TK_SUB TK_ID TK_PARIN parameters:prmts TK_PAROUT statements:stmnts TK_END TK_SUB
;


function_statement ::=  TK_FUNCTION TK_ID TK_PARIN parameters:prmts TK_PAROUT statements:stmnts TK_END TK_FUNCTION
            |TK_FUNCTION TK_ID TK_PARIN parameters:prmts TK_PAROUT TK_AS data_type:type statements:stmnts TK_END TK_FUNCTION
;

parameters ::=  parameter:prmt TK_COMMA parameters:prmts
        |parameter:prmt
        | /* Vacio */
;

parameter ::=   parameter_type:prmt_type TK_ID TK_AS data_type:type
;

parameter_type ::=  TK_BYVAL
                    | TK_BYREF
;

data_type ::=   TK_INTEGER
                |TK_BOOLEAN
                |TK_STRING
;

statements ::=  statement:stmnt statements:stmnts
                | /* Vacio */
;

statement ::=   if_statement:ifStatement
                |while_statement:whileStatement
                |for_statement:forStatement
                |do_statement:doStatement
                |variable_declaration:var_declare
                |expression:expr
                |TK_RETURN expression
                |TK_EXIT
;

if_statement ::=    TK_IF expression:expr TK_THEN statements:stmnts TK_END TK_IF
                    |TK_IF expression:expr TK_THEN statements:stmnts TK_ELSE statements:stmnts TK_END TK_IF
                    |TK_IF expression:expr TK_THEN statements:stmnts elseif_statements:elseifStmnts TK_END TK_IF
                    |TK_IF expression:expr TK_THEN statements:stmnts elseif_statements:elseifStmnts TK_ELSE statements:stmnts TK_END TK_IF
; 

elseif_statements ::=   elseif_statement:elseifStmnt elseif_statements:elseifStmnts
                        |elseif_statement:elseifStmnt
;

elseif_statement ::=    TK_ELSEIF expression:expr TK_THEN
;


for_statement ::=   TK_FOR variable_declaration:var_declare TK_TO expression:expr statements:stmnts TK_NEXT
                    |TK_FOR variable_declaration:var_declare TK_TO expression:expr TK_STEP TK_NUMBER statements:stmnts TK_NEXT
;

while_statement ::= TK_WHILE expression:expr statements:stmnts TK_END TK_WHILE
;

do_statement ::=    TK_DO TK_WHILE expression:expr statements:stmnts TK_LOOP
                    |TK_DO statements:stmnts TK_LOOP TK_UNTIL expression:expr
;

variable_declaration ::=    variable_declarator:var TK_COMMA variable_declaration:var_declare 
                            |variable_declarator:var
;


variable_declarator  ::=    TK_DIM TK_ID TK_AS data_type:type TK_EQUALS expression:expr
                |TK_ID TK_AS data_type:type TK_EQUALS expression:expr
                |TK_DIM TK_ID TK_EQUALS expression:expr
                |TK_ID TK_EQUALS expression:expr
                |TK_DIM TK_ID TK_AS TK_NEW data_type:type TK_EQUALS expression:expr TK_PARIN arguments:args TK_PAROUT
                |TK_ID TK_EQUALS TK_NEW data_type:type TK_PARIN arguments:args TK_PAROUT
;



expression ::=  numeric_expression:num_exp
                |boolean_expression:bool_exp
                |logical_expression:logic_exp
                |literal_expression:lit_exp
                |TK_ID:id
                |function_call:call
;

boolean_expression ::= expression:e1 TK_GREATERTHAN expression:e2
                       |expression:e1 TK_LESSTHAN expression:e2
                       |expression:e1 TK_GREATEREQUAL expression:e2
                       |expression:e1 TK_LESSEQUAL expression:e2
                       |expression:e1 TK_EQUALS expression:e2
;

logical_expression ::= TK_NOT expression:e1
                       |expression:e1 TK_OR expression:e2
                       |expression:e1 TK_AND expression:e2
                       |expression:e1 TK_XOR expression:e2
                       |TK_TRUE
                       |TK_FALSE
;
numeric_expression ::= expression:e1 TK_SUM expression:e2
                       |expression:e1 TK_MINUS expression:e2
                       |expression:e1 TK_PRODUCT expression:e2
                       |expression:e1 TK_DIVISION expression:e2
;

literal_expression ::=  TK_NUMBER
                        |TK_STRINGVAL
;

function_call ::=   TK_ID TK_PARIN arguments:args TK_PAROUT
                    |TK_ID TK_PARIN TK_PAROUT
;

arguments ::= argument TK_COMMA expression:expr
;

argument ::= expression:expr
;

是什么引起我的麻煩?

問題在於,沒有什么可以將一個陳述與另一個陳述分開。 expression是有效的語句,因此兩個連續的表達式是有效的statements 但是,一個語句也是如此。

現在, ID是一個expression ,帶括號的表達式是aen表達式。 所以first. (second) first. (second)是兩個statement s,否? 還是函數調用? 在第一種情況下,您需要將ID簡化為expression (然后是statement )。 在第二種情況下,您只需移動

因此,轉移減少沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM