什么是语法规则(在解析中)?

时间:2014-02-24 05:48:18

标签: parsing grammar interpreter lexer happy

我正在尝试编写一名翻译,但我很难理解该过程的理论基础。

据我所知,第一部分是编写一个词法分析器,它将字符串拆分为有效标记列表,然后使用解析器为此字符串生成相应的抽象语法树。但是,解析器是使用语法规则构建的,这是我难以理解的。

语法规则显然用于创建生成的抽象语法树的规则,但这个中间步骤究竟是如何工作的。它是否匹配字符串字符和特定的标记列表或。 。 ?

欢迎任何类型的直觉或解释。谢谢!

1 个答案:

答案 0 :(得分:1)

在互联网上搜索lex / yacc示例和教程。边干边学。 用C编程的能力也是必要的。

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

lex是古老的Unix词法分析器,它从基于正则表达式的规范生成C代码。 yacc是用于构建语法树的古老Unix解析器。它也会生成C代码。

这些工具的现代GNU版本称为flex和bison。

这是计算器的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; }
     ;
%%