编译原理问题:求解

词法规则要求: ①识别保留字:if、int、else、for、while、do、return、break、continue;单词种别码为1。 ②其他的都识别为标识符, 标识符由字母开头,后面可以是数字、字母和下划线;单词种别码为2。 ③常数为无符号整形数, 无符号的整数由数字开头,后面只包含数字;单词种别码为3。 ④运算符包括:+、-、*、/、=、>、<、>=、<=、<> ;单词种别码为4。 ⑤分隔符(界符)包括:,、;、{、}、(、); 单词种别码为5。 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如图: (2,”main”) (5,”(“) (5,”)“) (5,”{“) (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 求高手解答,刚刚学的编译原理,不懂,希望给出注释!

第1个回答  2011-09-27
E是文法开头。ε代表终结符号(推理中代表终点或结果,程序语言中代表常量等)。E T 这些大写字母一般代表非终结符号(这些代表中间过程,非结果。程序中代表函数等等)。开始是E。因为有个G(E)。E就是文法开始符号。推导就有E开始,它也是一个非终结符(代表函数、或者一个推导过程,类似于程序中的main(c++)、winmain(vc++)、dllmain(dll)等主函数)。

1算术表达式文法:这个文法是一个递归文法。计算机进行逻辑推导时会走很多弯路(类似于遍历一颗树的过程)。为了不让计算机走弯路(提高效率的目的),可以变换为第二种文法。这种文法消除了递归(消除了歧义,类似于后缀表达式),使计算机可以一条直线走到底儿推导出结果。

我也很久没看编译原理了。 呵呵
相似回答