前言:本实验采用自上而下的方法实现算术表达式的语法分析器。只是实现了对加减乘数和带括号的语法分析,判断语法的正确性。
一 实验要求:
(1)程序通过标准输入按行读取用户输入,表达式在1行内读完。
(2)程序对用户输入的内容首先进行词法分析处理(可以复用实验一的部分代码,由于词法规则更简单,可以大大简化),词法分析得到的词法单位对应文法中的终结符。//代码太长直接就用词法分析的结果进行语法分析。
(3)对于用户输入的表达式,如果经过分析后语法正确,给出相应提示。如果分析过程中遇到错误不需要尝试恢复分析,停止该次分析过程即可,但应尽量给出说明性较强的错误提示。
下面给出一些验证语法分析结果正确性的测试用例:
正确:a+3*( b + c/10) -4 +5 错误:a+3 ( b + c/10) 错误:(1+2)(3-4) 错误:(1+2
二:假设词法分析已经正确的完成,只进行语法分析
比如以 a+3*( b + c/10) -4 +5为例,进行词法分析后得到的结果为
1 (29,a) 2 (12,+) 3 (28,3) 4 (14,*) 5 (21,() 6 (29,b) 7 (12,+) 8 (29,c) 9 (15,/) 10 (28,10) 11 (22,)) 12 (13,-) 13 (28,4) 14 (12,+) 15 (28,5)
注意,上面的结果第一个参数是种别码,种别码的声明如下(关于词法分析的过程可具体参考我之前写的词法分析 https://www.cnblogs.com/henuliulei/p/10597281.html),当然种别码可以自己声明。
1 begin 1 2 end 2 3 if 3 4 then 4 5 while 5 6 do 6 7 const 7 8 var 8 9 call 9 10 procedure 10 11 odd 11 12 + 12 13 - 13 14 * 14 15 / 15 16 = 16 17 # 17 18 < 18 19 > 19 20 := 20 21 ( 21 22 ) 22 23 , 23 24 . 24 25 ; 25 26 (*多行注释*) 26 27 //单行注释 27 28 常数 28 29 标识符 29