2013-01-23 43 views
1

我必須使用YACC來實現字符串操作的計算機。我必須實現像+(用於連接字符串)或*(strcat自身n次的字符串)的操作。這些操作返回一個字符串並我在非終結符t1中使用它們.BUt我也有操作返回一個數字。這些操作在一個t2非終結符中。lex yacc nonterminal circularity

,比如我有:

 expr1: expr1 '+' expr1 { strcpy($$,$1); strcat($$,$3);} 
     | expr1 '-' expr1 { strcpy($$,minus($1,$3));}  
      | | expr1 '*' NUMBER {strcpy($$,mul($1,$3));} 
      |STRING; 

,我有:

 expr2 : STRING '?' STRING {strcpy($$nr_of_aparitions($1,$3));} 
; 

的事情是,在表達式2所定義的操作總是會返回一個數字。 所有工作正常,直到:

如果我有'dfdf'? 'edfd「,例如它一切正常。問題來了,當我必須在expr2:expr1?expr2中實現expr1,因爲圓形會出現。你可以提出什麼建議嗎?

+0

你是否還想過運算符優先級和關聯性。例如,'expr1 - expr2 + expr3'是什麼意思? – Eduardo

回答

1

一般來說,你不需要關心你稱之爲「循環」,我稱之爲「遞歸」,即在expr1中使用數值表達式,反之亦然。

我會按照如下方式重寫你的語法片段,以使你的代碼更容易瞭解:

stringExpr : stringExpr '+' stringExpr { strcpy($$,$1); strcat($$,$3); } 
      | stringExpr '-' stringExpr { strcpy($$,minus($1,$3)); }  
      | stringExpr '*' numberExpr { strcpy($$,mul($1,$3)); } 
      | STRING 
      ; 

numberExpr : stringExpr '?' stringExpr { strcpy($$nr_of_aparitions($1,$3)); } 
      | NUMBER 
      ; 

(我刪除了你的表達式1空的規則 - 我想這並不打算。)

我想知道爲什麼你沒有普通算術的語法規則,像5 + 2這樣的表達式,但也許這不是你的計劃的一部分。

如果你打算支持普通算術,那麼你將需要考慮如何解釋"foobar" - 1 + 1。此時,您可能需要查看operator precedence的yacc/bison功能。