【问题标题】:What is a Grammar Rule (in Parsing)?什么是语法规则(在解析中)?
【发布时间】:2014-02-24 05:48:18
【问题描述】:

我正在尝试编写解释器,但难以理解该过程的理论基础。

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

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

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

【问题讨论】:

    标签: parsing grammar interpreter lexer happy


    【解决方案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; }
         ;
    %%  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      相关资源
      最近更新 更多