Я пишу парсер со шлейфом и бизонов и до сих пор эти маркеры для прогибается:Bison функция синтаксического анализа и параметры в неправильном порядке
[ \t\n] ;
(x[0-9]+) {
yylval.var = strdup(yytext);
return VARIABLE;
}
~(x[0-9]+) {
yylval.var = strdup(yytext);
return NEG_VARIABLE;
}
[a-zA-Z0-9]+ {
yylval.name = strdup(yytext);
return NAME;
}
~[a-zA-Z0-9]+ {
yylval.name = strdup(yytext);
return NEG_NAME;
}
[\{\},\(\)] { return yytext[0];}
. ;
и эти правила синтаксического анализа для зубров являются:
fol:
clauses {cout << "Done with file"<<endl;}
;
clauses:
clauses clause
| clause
;
clause:
startc terms endc
;
startc:
'{' {cout << "Bison found start of clause" << endl;}
;
endc:
'}' {cout << "Bison found end of clause" << endl;}
;
function:
NAME startfun endfun {cout << "Bison found a function " << $1 << endl;}
|NEG_NAME startfun endfun {cout << "Bison found a negative function " << $1 << endl;}
;
startfun:
'(' {cout << "Bison found start of params" << endl;}
;
endfun:
terms ')' {cout << "Bison found a function end" << endl;}
;
terms:
terms ',' term
| term
;
term:
VARIABLE {cout << "Bison found a variable "<< $1 << endl;}
| NEG_VARIABLE {cout << "Bison found a negative variable " << $1 << endl;}
| NAME {cout << "Bison found a constant " << $1 << endl;}
|function
;
Теперь все работает отлично, за исключением того, что когда он анализирует функцию, он сначала анализирует параметры и parens, а затем дает мне имя функции в конце. Я могу обойти это, но это делает мою жизнь труднее, так как я храню функции в виде непересекающихся множеств, и мне нужно будет сохранить список параметров, пока я не получу имя функции для создания корня, а затем объединить их вместо его создания.
Может ли кто-нибудь показать мне, как заставить Бизона дать мне имя функции перед параметрами? Я пробовал больше часа, не повезло.
То, что я имел в виду, я хотел быть в состоянии справиться с именем функции до параметров, так как я не использую список, но подстановка дерево , и я скорее поместил его в дерево напрямую, чем положил его в список, а затем перенесил. Альтернативный метод решил мою проблему. – user381261