2014-02-24 122 views
2

我正在嘗試寫一個解釋器,但我很難理解這個過程的理論基礎。什麼是語法規則(解析中)?

我的理解是,第一部分是編寫一個詞法分析器,將字符串拆分成有效令牌列表,然後使用分析器爲這個令牌字符串生成相應的抽象語法樹。但是,解析器是使用語法規則構建的,這是我很難理解的。

語法規則顯然用於創建生成的抽象語法樹的規則,但這個中間步驟到底有多精確。它是否對字符串字符和特定的標記列表進行模式匹配? 。 。?

歡迎任何類型的直覺或解釋。謝謝!

回答

1

在互聯網上搜索lex/yacc示例和教程。邊幹邊學。 在C編程的能力也是必要的。

http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html

法是古老的Unix詞法分析器,其從基於正則表達式生成規範C代碼。yacc是構建語法樹的古老Unix解析器。它也會生成C代碼。

這些工具的現代GNU版本被稱爲flex和野牛。

這是計算器的yacc代碼的核心。它顯示瞭如何從令牌構建更高級別的構造,以及在遇到這樣的構造時該怎麼做。

%% 
list : // empty 
    | list stm '\n'   { print(); } 
    | list cmd '\n'   { print(); } 
    | list cmd stm '\n'  { print(); } 
    | list stm cmd '\n'  { print(); } 
    | list cmd stm cmd '\n' { print(); } 
    | list error '\n'  { yyerrok; print(); } 
    ; 
cmd : COMMAND    { commands[$1](); } 
    ; 
stm : expr     { output = $1; outputPush(); } 
    | VAR '=' expr   { vars_set($1, &$3); } 
    ; 
expr :      { outputGet(); $$ = output; } 
    | '_'     { outputGet(); $$ = output; } 
    | '(' expr ')'   { $$ = $2; } 
    | expr OPADD expr  { $$ = tNumOpIn ($1, $2, $3); } 
    | expr OPMUL expr  { $$ = tNumOpIn ($1, $2, $3); } 
    | expr OPPOW expr  { $$ = tNumOpIn ($1, $2, $3); } 
    | OPPRE expr   { $$ = tNumOpPre($1, $2); } 
    | VAR     { if (vars_get($1,&$$)) $$=output; } 
    | NUMBER    { $$ = $1; } 
    ; 
%%