2014-01-21 41 views
0

括號,我知道如何成對托架匹配,例如:如何在LALR(1)解析器匹配YACC

expr: /* empty */ 

     | '(' expr ')' 
     ; 

可以匹配以下輸入:

((())) 

但我不知道如何編寫規則來匹配這樣的輸入:

((() ()) () (() () ())) 

這意味着有很大的配對bracke內許多一對托架t是 在同一級別。一個簡單的例子是這樣的:

(() ()) 

假設有很多嵌套括號,如何編寫規則?

回答

1

假設你正在尋找類似的口齒不清列表的東西,那麼你可能會想爲這一目的的子表達式:

expr: /* empty */ 
    | expr '+' expr 
    | ... 
    | list-expr 

list-expr: '(' expr ')' 
     | list-expr '(' expr ')' 

如果你沒有其他的表情(如所示+我的例子在這裏),那麼你不需要有一個單獨的規則。

注意,可能會阻止你,從具有表達式定義一個函數調用:

expr: expr '(' expr ')' // C-like function call not compatible 

你仍然可以有標識的呼叫,如:

expr: IDENTIFIER '(' expr ')' 
+0

感謝。這有很大幫助。 – user3220866