实验内容
Exp2
使用lex为下述文法语言写一个词法分析器。
<程序> -> PROGRAM <标识符> ; <分程序>
<分程序> -> <变量说明> BEGIN <语句表> END.
<变量说明> -> VAR <变量说明表>;
<变量说明表> -><变量表>: <类型> | <变量表>: <类型>; <变量说明表>
<类型>- > INTEGER | REAL
<变量表> -> <变量> | <变量>, <变量表>
<语句表> -> <语句> | <语句>; <语句表>
<语句> -> <赋值语句> | <条件语句> |
<赋值语句> -> <变量> := <算术表达式>
<条件语句> -> IF <关系表达式> THEN <语句> ELSE <语句>
<复合语句> -> BEGIN <语句表> END
<算术表达式> -> <项> | <算术表达式> + <项> | <算术表达式> - <项>
<项> -> <因式> | <项> * <因式> | <项> / <因式>
<因式> -> <变量> | <常数> | (<算术表达式>)
<关系表达式> -> <算术表达式> <关系符> <算术表达式>
<变量> -> <标识符>
<标识符> -> <标识符><字母> | <标识符><数字> | <字母>
<常数> -> <整数> | <浮点数>
<整数> -> <数字> | <数字> <整数>
<浮点数> -> .<整数> | <整数>.<整数>
<关系符> -> < | <= | = | > | >=| <>
<字母> -> A | B | …| X | Y | Z | a | b | …| x | y | z
<数字> -> 0|1|2|…|9
Exp3
要求每次调用词法分析函数yylex时,只返回一个记号(token);
为记号选择适当的属性值,并且每次词法分析函数返回记号前,都将记号的属性值存入全局变量yylval中。(yylval可以自己定义为全局变量);
记号属性值的选择:标识符的属性为标识符的名字字符串(例如,标识符name1的属性为字符串”name1”),整数的属性为整数值,浮点数的属性为浮点数值。其他记号属性值可自己选择。关键字可以省略属性。
注意:由于属性值需要存入yylval中,并且记号属性值的类型比较多(可能为字符串、整数、浮点数等),因此yylval必须能同时存放各种类型的值(提示:将yylval设置为union类型)。
在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases目录下的test1.p测试例的测试。
实验过程
添加记号名
1 |
正规定义
1 | int {digit}+(E[+-]?{digit}+)? |
定义yylval
1 | union data{ |
完整代码
1 | /* 把讨厌的注释去掉 */ |