以下是針對 Parser generator 2.07 中的 Class 例子的筆記;要查看完整的工程和代碼,可參考原例。
標題
|
說明
|
分析棧和屬性棧
|
- 分析棧:保存當前的文法符號,即,終結符或非終結符。
- 屬性棧:保存當前文法符號對應的數(shù)據(jù)(類似'屬性文法'中的屬性),在 Parser Generator 中該數(shù)據(jù)類型為 YYSTYPE ,用戶可以自己定義該類型。
|
%token <value> NUMBER
|
用來說明文法符號和屬性的關系
NUMBER 為詞法分析器中返回的一種符號類型; <value> 指出 NUMBER 和屬性中的 value 成員對應。
|
%type <value> expr
|
用來指明非終結符 expr 對應于屬性中的 value 成員
|
符號的順序和優(yōu)先級
|
按定義的順序,由低到高;即,越靠后的符號,優(yōu)先級越高,例如: %right '='
%left '+', '-'
%left '*', '/'
%right UMINUS
|
。。。 | '-' expr %prec UMINUS { $$ = -$2; } 。。。
|
用 %prec 指定本條規(guī)則的優(yōu)先級。本例中,指明 '-' 和右邊的表達式結合時,優(yōu)先級和 UMINUS 相同;而注意到,UMINUS 在之前定義為比其他四則運算符優(yōu)先!
|
規(guī)約過程中的文法符號和屬性引用
|
$$
|
:當前規(guī)約表達式的結果
|
$1,$2…
|
:從左至右依次表示規(guī)約表達式中的符號
|
注意:如果文法屬性為自定義結構,通過$引用時,其值和符號聲明中的 <xxxx> 成員對應。例如:
%token <value> NUMBER
|
修改默認的輸入源
|
重載 yylexer::yygetchar() 虛函數(shù);而不是之前認為的 yylexer::yyinput() !
|