2016-09-16 13 views
0

次の解析コードがありますが、ターミナル以外の式とfunction_callの間でシフト/リダクションの競合が発生しています。これは、Visual Basicプログラミング言語用の小さな構文解析コードです。 CFGは間違っていますか?または、2つの非終端記号のみに問題があるかどうか。CUPとShift/Reduceの競合が発生しています

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 
; 

何が原因で問題が発生する可能性がありますか?

答えて

0

問題は、1つのステートメントと次のステートメントを区別することは何もないことです。 expressionは有効なステートメントなので、連続する2つの式は有効なstatementsです。しかし、それでは、単一のステートメントもそうです。

IDexpressionであり、カッコ内の式はaen式です。だからfirst. (second)は2つですstatement、¿いいえ?それとも関数呼び出しですか?最初のケースでは、IDexpression(そしてstatement)に減らす必要があります。第2のケースで、あなただけのをシフト。

したがって、競合をシフト減らす。

関連する問題