ошибка сдвига/уменьшения конфликтов

Я получаю 20 ошибок сдвига/уменьшения конфликтов. Я обработал приоритет операторов, объявив их отдельно. Я не уверен насчет exprList и propertyList, я пробовал разные их версии, но ошибка не изменилась.

%#include<studio.h>


void yyerror( const char *s)
{
printf("%s\n",s);
}
%}
%token tFOR tIN tFUNCTION tSEMICOLON tLPAR tLBRKT tLBRACE tCOLON tINT 
tREAL tSTRING tWHILE tVAR tELSE tCOMMA tRPAR tRBRKT tRBRACE tEQ tNOT tIF  
tIDENT
%token tGT
%token tLT
%token tEQCHECK
%left tPLUS tMINUS
%left tSTAR
%%
statementList:statement|statementList statement | statementList 
tSEMICOLON statement;
statement: assign | if | expr |statementBlock | while |for | functionCall 
| functionDeclaration;
assign: tIDENT tEQ expr | tVAR tIDENT tEQ expr;
if: ifPart elsePart;
ifPart: tIF tLPAR expr tRPAR statementBlock;
elsePart: tELSE statementBlock;
while: tWHILE tLPAR expr tRPAR statementBlock;
for: tFOR tLPAR tVAR tIDENT tIN expr tRPAR statementBlock | tFOR tLPAR 
expr tRPAR statementBlock;
functionDeclaration: tFUNCTION tIDENT tLPAR exprList tRPAR statementBlock
                        | tFUNCTION tIDENT tLPAR tRPAR statementBlock;
statementBlock: tLBRACE statementList tRBRACE;
functionCall:tIDENT tLPAR exprList tRPAR | tIDENT tLPAR tRPAR;
expr: tIDENT | tSTRING |tLBRKT tRBRKT | tLBRKT exprList tRBRKT
        |tLBRACE tRBRACE | tLBRACE propertyList tRBRACE | tNOT expr |
 expr tPLUS term | expr tMINUS term | term |
 expr tEQCHECK expr | expr tLT expr | expr tGT expr;
exprList: expr | exprList tCOMMA expr;
propertyList: tIDENT tCOLON expr
                | propertyList tCOMMA tIDENT tCOLON expr;
term:term tSTAR factor | factor;
factor: tREAL| tINT;

%%

person bo_    schedule 18.03.2018    source источник
comment
к вашему сведению обсуждение с новичком, который продолжал заниматься. вы тоже могли бы; просто сказать, что нельзя, не объясняет почему. чтобы помочь, больше объяснений нужно, кроме того, просто не могу. Я мог быть слишком краток, я признаю это. Я буду осторожен в будущем, чтобы не делать этого. связанное обсуждение также связано с вашим вопросом: для вызова функции она должна быть заключена в круглые скобки; чтобы не вызывать значение как функцию, оно не должно быть заключено в круглые скобки. Счастливые тропы.   -  person Will Ness    schedule 29.04.2018
comment
Спасибо за ваш интерес. Я понял использование скобок в схеме с помощью обсуждения, которое вы упомянули. Это очень помогает. Я просил помощи о Схеме, а не об орфографических ошибках.   -  person bo_    schedule 29.04.2018
comment
отличный! не стесняйтесь публиковать больше, если это необходимо. конечно, ТАК может быть немного враждебно временами... (и я не говорил вообще ни о каких орфографических ошибках.... или вы имея в виду использование скобок? это не правописание, это важная часть синтаксиса Лиспа!....).   -  person Will Ness    schedule 29.04.2018


Ответы (1)


%token не объявляет значение приоритета для оператора. Таким образом, tLT, tGT и tEQCHECK не имеют объявлений приоритета. (И tNOT тоже, как я понял впоследствии.)

С другой стороны, вы объявили приоритет для tPLUS, tMINUS и tSTAR, но эти определения не нужны (и не используются), потому что ваша грамматика уже явно указывает на их приоритеты.

Однако я считаю, что в вашем определении factor есть ошибка: оно находится в нижней части цепочки приоритетов, поэтому оно должно включать все синтаксисы операндов. Кажется, это не так; действительно, я не вижу никакого продукта, который принимал бы выражение в скобках (например, 2 * (3 + 4)), и я понятия не имею, как вы ожидаете, что выражения будут включать вызовы функций.

Вы, вероятно, должны решить, будете ли вы использовать объявления приоритета, и либо делать это последовательно (что часто проще), либо не делать вообще. Просмотр материалов вашего курса по этому вопросу может помочь; если нет, то в сети есть много примеров.

person rici    schedule 18.03.2018