*****看看这个编译器怎么做,100分求相关LEX和YACC代码,分不够速加*****
1.简单高级语言文法:
<程序> → [<常量说明>][<变量说明>]<语句>
<常量说明> → Const <常量定义>{,<常量定义>};
<常量定义> → <标识符>=<无符号整数>
<无符号整数> → <数字>{<数字>}
<字母> → a | b | c | … | z
<数字> → 0 | 1 | 2 | … | 9
<标识符> → <字母>{<字母>|<数字>}
<变量说明> → Var <标识符>{,<标识符>};
<语句> → <赋值语句>|<条件语句>|<当循环语句>|<复合语句>
<赋值语句> → <标识符>=<表达式>
<表达式> → <项>{<加法运算符><项>}
<项> → <因子>{<乘法运算符><因子>}
<因子> → <标识符>|<无符号整数>|‘(’<表达式>‘)’
<加法运算符> → +|-
<乘法运算符> → * |/
<条件语句> → if <条件> then <语句>| if <条件> then <语句> else <语句>
<条件> → <表达式><关系运算符><表达式>
<关系运算符> → ==|<=|<|>|>=|<>
<当循环语句> → while <条件> do <语句>
<复合语句> → begin <语句>{;<语句>} end
注:
<> — 非终结符号
[] — 可选项
{} — *
| — 或
2.分析
(1)单词符号结构
无符号整数:NUM =( 0 | 1 | 2 | … | 9 )+
标识符:ID =( a | b | c | … | z )( a | b | c | … | z | 0 | 1 | 2 | … | 9)*
(2)语法规则
P → C V S | C S | V S | S
/* P-程序 C-常量说明 V-变量说明 S-语句
C → Const D ;
/* D-常量定义
D → id = num , D | id = num
V → Var ID ;
ID → id , ID | id
S → A | I | W | B
/* A-赋值语句 I-条件语句 W-当循环语句 B-复合语句
A → id = E
/* E-表达式
E → T | E P T
/* T-项 P-加法运算符
T → F | T M F
/* F-因子 M-乘法运算符
F → id | num |(E)
P → + | -
M → * | /
I → if X then S | if X then S else S
/* X-条件
X → E O E
/* O-关系运算符
O → == | <= | < | > | >= | <>
W → While X do S
B → begin Y end
Y → S ; Y | S
(3)例子
Const x = 8 , y = 7 ;
Var a , b , c ;
begin
a = x ;
if a > 0
then
begin
c = y – 1 ;
a = a + 2 ;
end
else
begin
c = a + y ;
end
b = y ;
while b >= 0
do a = a – 1 ;
end
3.实验要求:
(1) 编写词法分析程序(源程序输入)
(2) 编写语法分析程序
(3) 编写语义分析程序(三地址代码输出)
(4) 符号表设计
(5) 错误处理
(6) 集成各子程序为一小型编译器
-------------------------------------------------
以上是要求实现的功能,急求LEX和YACC源码。