这里解答的语法分析题是以此链接中的实验二为背景:语法分析实验
1.有文法:
- E->E+T|E-T|T
- T->T*F|T/F|F
- F->i
2.通过该文法实现对句子(如:12+33/3*3-45)进行语法分析,若有错则指出哪一个有错。
首先我们需要知道该文法的作用,总的来说就是句子(12+33/3*3-45)与文法进行匹配,若句子都能匹配上文法则说明没错。若有错则需要指出即可,而如何匹配呢?
首先题目已经指出该语法分析是通过自顶向下(自顶向下包含多种方法如LL1方法等),这里若想要实现该程序,有如下:
第一步:消除左递归,这里是直接递归的文法,直接运用套路
若有文法:X->XY|Z
则有:X->ZX'
X'->YX'|E (E代码空)
故而这里消除左递归后的文法有:
E->TE’
E’->+TE’|-TE’|ε
T->FT’
T’->*FT’|/FT’|ε
F->i
第二步:词法分析默认已经完成了,到这里就ok了,就按照上面消除递归后的文法进行编写语法分析程序即可。
这里给出一个错误的句子(如12+-23/23-33*33)这里面很明显错了一个“+”,因为按照文法来看不能同时两个算符连在一起。而这里“+-“中的”-“很明显是不符合文法的,因为根据E’->+TE’,加号“+”后跟着的是T,而T后面跟着的T->FT',而F->i故而在+后应该跟着的是数字i故而出错了。
这里给出词法分析与语法分析的结合c++程序:程序