Parsing 如何为BNF语法编写Lex和yacc代码

Parsing 如何为BNF语法编写Lex和yacc代码,parsing,compiler-construction,yacc,lex,Parsing,Compiler Construction,Yacc,Lex,我是一名初学者,从学习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> <co

我是一名初学者,从学习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 
例如,如果我想使用lex和yacc编写嵌套语句,我该怎么做
那样做
注意:这与if-else相同
:=

:=

开始
=;|;
:=循环:=执行之前的步骤
这个
这个那个
:=write()| write()
:=评论
::= == 
::=  > 
::=  <  
::=  >=  

::=yacc的输入语法基本上是BNF变体,您可以直接向其输入字符。因此,将单字符标记替换为字符文字,将s替换为标识符,并将::=替换为just:,您几乎有一个yacc语法,尽管它不是一个明确的语法,因此如果不进一步处理歧义,它将无法正常工作


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

从阅读关于lex和yacc的文档开始。当你有特定的问题时,请回来。不,我不是落选者,但我理解他的情绪。你为什么要用BNF?它已经过时近50年了。
yacc
使用的语法现在是首选。