幸运的是
-----------------------------------------
现在你可以看明白了上边的规则,问题又来了,我们怎么来处理这种语法的规则呢?
该不会要自己写一个人肉编译吧?该不会要自己写一个人肉编译吧?该不会要自己写一个人肉编译吧?
哈哈,不要担心,我们有现成的工具,它的名字叫另一种C编译器(yacc , yet another C compiler) ,而不用重新发明轮子。
yacc 可以直接读取我们上边所写的规则 ,执行我们所要作的,只是将匹配的规则规定出来一个动作就行。
比如:
如果我们遇到了expression + number 这个语法 ,我们就把两个表达式加起来就行了
遇到了number 语法,把这个数返回就行了
这两条规则,在yacc 里写出来是这样的:
expression:
number { $$ = $1 ;}
| expression ‘+’ number { $$ = $1 + $3 }
yacc 能接受的语法是:
语法 {动作}
就是说,遇到了一条能接受的语法,我们执行什么样的动作。
对于每个能接受的语法,每个语法中的符号(比如number ,express ‘+’),
yacc 都会把它们添加到$1,$2,$3…中去,在action语句里,直接使用它,整条语句的结果,用$$表示
这样完成以后,我们的整个的语法文件如下所示:
ch3-01.y:
%token NUMBER
%%
result: expression { printf(&