2012-11-26 63 views
1

我正在用Yacc編寫一個編譯器,並且很難弄清楚如何編寫生成以匹配函數。在我的語言,函數的定義是這樣的:Yacc - 用於匹配函數的生成

function foo(a, b, c); 

我創建的lex模式來匹配單詞功能FUNC,和任何C風格的名字來命名。

理想情況下,我想是這樣的:

FUNC NAME OBRACKET NAME (COMMA NAME)* CBRACKET 

這將允許在名稱和CBRACKET之間的一些數目不詳的雙逗號NAME的。

此外,我怎麼知道它找到了多少?

+0

我們可以用正確的術語請。 '生產',而不是'模式'。 – EJP

回答

0

一個小實驗後,我發現這工作得很好:

int argCount; 
int args[128]; 

arglist: nonemptyarglist 
     | 
     ; 

nonemptyarglist: nonemptyarglist COMMA singleArgList 
       | singleArgList 
     { 

     }; 

singleArgList: 
      REGISTER 
     { 
      args[argCount++] = $1; 
     }; 
1

您可以嘗試這樣的事:

funcdecl: FUNC NAME OBRACKET arglist CBRACKET SEMI 
; 

arglist: nonemptyarglist 
     | 
; 

nonemptyarglist: nonemptyarglist COMMA NAME 
       | NAME 
; 

我建議使用語法來構建你的語言語法樹,然後做任何你需要的語法樹解析完成後。野牛和yacc的功能使得它變得相當簡單;在信息頁面中查找%union%type

+0

我如何在'nonemptyarglist'中提取'NAME'的值? $ 3或$ 1? – charliehorse55