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

安科

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

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

显然,可以使用语法规则来创建结果抽象语法树的规则,但是该中间步骤的工作原理是什么。它与字符串字符和特定的标记或列表匹配吗?。?

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

z

在互联网上搜索lex / yacc示例和教程。边干边学。也必须具有使用C进行编程的能力。

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

lex是古老的Unix lexer,它从基于正则表达式的规范生成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; }
     ;
%%  

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

(JavaScript)语法规则

来自分类Dev

(JavaScript)语法规则

来自分类Dev

路径语法规则

来自分类Dev

在 Scala 中,什么语法规则适用于 foreach(println)?

来自分类Dev

有什么方法可以删除语法规则中不需要的空格?

来自分类Dev

Scheme的语法规则-在`...`中混合不同的语法选择

来自分类Dev

在Perl中声明变量的语法的语法规则?

来自分类Dev

此Haskell代码的语法规则是什么?

来自分类Dev

查询ANTLR4解析树,是否在语法规则中对子项进行了量化

来自分类Dev

如何在ANTLR的语法规则中处理歧义标记?

来自分类Dev

获取antlr3中的语法规则文本

来自分类Dev

def或val或lazy val的语法规则?

来自分类Dev

如何为错误创建语法规则?

来自分类Dev

如何优化此语法规则?

来自分类Dev

树梢忽略语法规则

来自分类Dev

为什么我的程序无法正确读取消除的左递归语法规则?C ++

来自分类Dev

使用正则表达式在SML中编写语法规则

来自分类Dev

语法规则表达式本身是否对Scheme中的值求值?

来自分类Dev

如何在没有root的`vim`中增加文件类型的现有语法规则集?

来自分类Dev

如何使用Scheme中的语法规则从List创建Alist?

来自分类Dev

交叉引用同一语法规则中的多个名称

来自分类Dev

如何注释 yacc 中的语法规则和 lex 中的正则表达式匹配规则?

来自分类Dev

为什么antrl4无法将标记识别为语法规则的一部分?

来自分类Dev

Java中的方法规则重载说明

来自分类Dev

匹配一组标记的Bison语法规则

来自分类Dev

从yacc文件中提取BNF语法规则

来自分类Dev

Haskell中缀数据类型构造函数的语法规则

来自分类Dev

语法规则优先级如何工作?

来自分类Dev

将自上而下的语法规则转换为BNF

Related 相关文章

热门标签

归档