首页 > 解决方案 > 如何为 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 

标签: parsingcompiler-constructionyacclex

解决方案


yacc 的输入语法基本上是一个 BNF 变体,你可以直接用字符输入它。因此,将单个字符标记替换为字符文字,将 <name> 替换为标识符,并将 ::= 替换为 : 并且您几乎拥有一个 yacc 语法,虽然不是一个明确的语法,所以如果没有它就无法正常工作进一步的工作来处理歧义。

将一些规则移动到 lex 中会更有效,并且上面的语法对需要处理的空格有不完整的假设,但是如果你从任何关于 lex&yacc 的基本教程开始(其中有很多),它相当直接向前。


推荐阅读