如何为BNF语法编写Lex和yacc代码[关闭]

问题描述 投票:-1回答:1

我是一个初学者,刚开始学习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 
parsing compiler-construction yacc lex
1个回答
1
投票

yacc的输入语法基本是BNF的变体,可以直接用字符喂它。 因此,将单字符标记替换为字符字元,将<name>s替换为标识符,将::=替换为仅仅是:,你几乎就有了一个yacc语法,虽然不是一个毫不含糊的语法,所以如果不进一步处理含糊不清的地方,它将无法正常工作。

把一些规则移到 lex 中会更有效率,而且上面的语法有关于空白的不完全假设需要处理,但如果你从任何关于 lex&yacc 的基本教程开始 (数不胜数)它合理的直接。

© www.soinside.com 2019 - 2024. All rights reserved.