2011-12-04 24 views
2

說我有這樣的語法:yacc非終結符號的相關性?

expr : expr '+' expr { $$ = operation('+', $1, $3); } 
    | expr '-' expr { $$ = operation('-', $1, $3); } 
    | expr '*' expr { $$ = operation('*', $1, $3); } 
    | expr '/' expr { $$ = operation('/', $1, $3); } 
    | num 
    ; 

每個地方的經營者都附有一個優先級,並標記爲左結合。

然後我想修改我的語法使得:

op : '+' | '-' | '*' | '/' ; 

expr : expr op expr { $$ = operation($2, $1, $3); } 
    | num 
    ; 

如何YACC(如果連在所有)決定在這種情況下,關聯性和op優先?在評估op時,它是否會追蹤所有可能的優先級/關聯性+,-,*/,或者是否定義非終結符號的關聯性沒有意義? AFAIK,優先順序爲非終止符,它使用最右端的終端符號的優先順序,但我找不到關於非終結符的關聯規則本身的任何文檔。

回答

2

執行此操作的「正常」方式(據我所知)是爲每個操作符定義一個不同的expr類型,這樣可以非常明確地控制發生了什麼。

Python的語法就是一個很好的例子:http://docs.python.org/reference/grammar.html

+0

謝謝,我知道這不是一個真正的語法結構的好方法。我有我自己的LALR(1)解析器(在ruby中),當運算符和操作數之間存在非終結規則時,運算符優先級/關聯性不起作用,所以我大多好奇yacc是否處理這個問題。我個人儘量避免它,但我的一個用戶絆倒了它,我們都沒有注意到它的原因;這讓我想知道它是否易於修復。 – d11wtq