2012-04-17 2 views
0

Я пишу парсер со шлейфом и бизонов и до сих пор эти маркеры для прогибается: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, а затем дает мне имя функции в конце. Я могу обойти это, но это делает мою жизнь труднее, так как я храню функции в виде непересекающихся множеств, и мне нужно будет сохранить список параметров, пока я не получу имя функции для создания корня, а затем объединить их вместо его создания.

Может ли кто-нибудь показать мне, как заставить Бизона дать мне имя функции перед параметрами? Я пробовал больше часа, не повезло.

ответ

1

Что вы подразумеваете под «дать мне имя функции перед параметрами»? В настоящее время вы не печатаете имя функции до тех пор, пока не увидите endfun и уменьшите правило функции, которое после различных правил параметров. Обычная техника должна иметь условия правила производят список вещей, которые затем могут быть использованы в правиле функции:

terms: terms ',' term { $$ = append_list($1, $3); } 
    | term { $$ = create_singleton_list($1); } 
    ; 

term: VARIABLE { $$ = new VariableTerm($1); } 

...

С другой стороны, если вы просто хотите, чтобы напечатать вещи, вы может иметь правило, уменьшается, как только вы видите имя функции:

function: funcname startfun endfun {cout << "Bison ending a function " << $1 << endl;} 
     ; 

funcname: NAME { cout << "Starting a function " << ($$ = $1) << endl; } 
     | NEGNAME { cout << "Starting a negative function " << ($$ = $1) << endl; } 
     ; 
+0

То, что я имел в виду, я хотел быть в состоянии справиться с именем функции до параметров, так как я не использую список, но подстановка дерево , и я скорее поместил его в дерево напрямую, чем положил его в список, а затем перенесил. Альтернативный метод решил мою проблему. – user381261

Смежные вопросы