У меня есть следующий код синтаксического анализа, но я получаю конфликт сдвига/уменьшения между выражением 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
;
Что может вызвать у меня проблемы?