parsing - 如何为 BNF 语法编写 Lex 和 yacc 代码
问题描述
我是一个初学者,开始学习 lex 和 yacc,我的 BNF 语法如下所示: 有人可以建议我在给出下面给出的 BNF 语法时如何编写 Lex 和 yacc
For example, if I want to write nested statements using (this that) using lex and yacc how can i
do that
Note: this that is same as if else
<language>::=<code>
<code>::=<statement><code>
<program>::=begin<statement_list>end
<statement_list>=<statement>;|<statement>;<statement_list>
<statement>::=loop <var> := <var> step <var> until<var> do
<statement>::= this <cond><statement>
<statement>::=this<cond><statement> that<statement>
<statement>::=write(<string>)|write(<expr>)
<statement>::=comment <string>
<cond>::=<val> == <val>
<cond> ::= <val> > <val>
<cond> ::= <val> < <val>
<cond> ::= <val> >= <val>
<cond> ::= <val> <= <val>
<statement>::=<var>:=<expr>
<expr>::=<val> + <val>| <val> * <val>| <val> - <val>|<val> / <val>|<val>
<val>::=<var>
<val> ::= <num>
<string>::="<text>"
<num> ::= <dig> | <dig><num>
<text> ::= <dig> | <char> | <text><text>
<val>::=A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x |
y | z
<dig> :: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
解决方案
yacc 的输入语法基本上是一个 BNF 变体,你可以直接用字符输入它。因此,将单个字符标记替换为字符文字,将 <name> 替换为标识符,并将 ::= 替换为 : 并且您几乎拥有一个 yacc 语法,虽然不是一个明确的语法,所以如果没有它就无法正常工作进一步的工作来处理歧义。
将一些规则移动到 lex 中会更有效,并且上面的语法对需要处理的空格有不完整的假设,但是如果你从任何关于 lex&yacc 的基本教程开始(其中有很多),它相当直接向前。
推荐阅读
- c# - 当我从 Controller.File 返回 FileContentResult 时,下载停止在 128kb
- laravel - livewire中filter组件和table组件之间的通信
- django - 从 Django 模板中 for...loop 的输出中删除/去除多余的空间
- java - 当本地一切正常时,Spring Boot Security 会导致应用程序在部署到 GAE 时关闭
- python - 订购在 pydrive 中列出子项的结果
- fastapi - 我应该缓存 FastAPI 依赖项吗?
- git - 从提交中获取作者登录名(或用户名)
- javascript - 如何映射一个对象数组并单独显示每个对象?我希望显示每个披萨订单
- netlify - Netlify CMS 自定义预览问题危险SetInnerHTML={{ __html: widgetFor('body') }} 在/admin 预览中显示[object Object]
- .htaccess - 通过 htaccess 删除 URL 字符串查询中的空格