2016-09-16 5 views
0

У меня есть следующий код синтаксического анализа, но я получаю конфликт сдвига/уменьшения между выражением non terminal и function_call. Это небольшой синтаксический код для языка программирования Visual Basic. Может ли CFG ошибиться? Или проблема только в этих двух нетерминальных символах.Я получаю конфликт Shift/Reduce с CUP

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

Проблема в том, что ничто не отделяет одно утверждение от следующего. Оператор expression является допустимым, поэтому два последовательных выражения являются действительными statements. Но тогда это одно утверждение.

В настоящее время ID является expression, а выражение в скобках является выражением. Итак, first. (second) - это два statement s, ¿no? Или это вызов функции? В первом случае вам необходимо уменьшить ID до expression (а затем statement). Во втором случае, вы просто сдвигать (.

Следовательно, сдвиг-свертка конфликт.