我是一个初学者,刚开始学习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>s替换为标识符,将::=替换为仅仅是:,你几乎就有了一个yacc语法,虽然不是一个毫不含糊的语法,所以如果不进一步处理含糊不清的地方,它将无法正常工作。
把一些规则移到 lex 中会更有效率,而且上面的语法有关于空白的不完全假设需要处理,但如果你从任何关于 lex&yacc 的基本教程开始 (数不胜数)它合理的直接。