实验一:词法分析(点击查看实验思路)
实验目的:
设计实现一个词法分析程序,加深对词法分析原理的理解
实验内容:
(1)设一小型编译程序关于高级语言有如下的规定:
高级语言程序具有四种基本结构:顺序结构﹑选择结构﹑循环结构和过程。为了便于掌握编译的核心内容,突出重点,简化编译程序的结构,同时又涵盖高级语言程序的基本结构,我们选取赋值语句﹑if语句和while语句作为前三种结构的代表,略去了过程结构。实际上,上述三种语句已经基本满足了高级语言的程序设计。因此,我们仅考虑由下面产生式所定义的程序语句:
S→if B then S else S ︱while B do S ︱begin L end︱A
L→S;L︱S
A→i:=E
B→B∧B︱B∨B︱¬ B︱(B) ︱i rop i︱i
E→E+E︱E*E︱(E) ︱i
其中,各非终结符的含义如下:
S——语句;
L——语句串;
A——赋值句;
B——布尔表达式;
E——算术表达式。
各终结符的含义如下:
i ——整型变量或常数,布尔变量或常数;
rop ——六种关系运算符的代表;
; ——起语句分隔符作用;
:= ——赋值符号;
¬ ——逻辑非运算符“not”;
∧ ——逻辑与运算符“and”;
∨ ——逻辑或运算符“or”;

  • ——算术加运算符;
  • ——算术乘运算符;
    ( ——左括号;
    ) ——右括号。
    注意,六种关系运算符分别为
    <:小于 <=:小于等于 <>:不等于

    :大于 >=:大于等于 =:等于
    关于表达式的运算,我们规定由高到低优先顺序为算术运算、关系运算、布尔运算;并且服丛左结合规则。算术运算符优先级的顺序依次为“( )”﹑“” ﹑“+” ;布尔运算符优先级的顺序依次为“¬ ”﹑“∧”﹑“∨”;六个关系运算符优先级相同。
    我们规定的程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定在语句末要加上“#~”表示程序结束。下面给出的是符合规定的程序示例:
    begin
    A:=A+B
    C;
    C:=A+2;
    while A<C and B<D do
    while A>B do
    if M=N then C:=D
    else while A<=D do
    A:=D
    end#~

(2)该小型编译程序关于单词的内部定义
由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:
(单词种别,单词自身的值)
我们对常量,变量,临时变量,保留关键字(if、while、begin、end、else、then、do等),关系运算符,逻辑运算符,分号,括号等,规定其内部定义如表1所示。
表1 关于单词的内部定义

实验要求:
请对下列程序进行词法分析,输出单词的种别编码和值:

begin
    begin

        begin 
         a:=1
        end;

      begin 
         b:=1
    end;
    q:=10
    end;

    x:=9;
    y:=11;
    z:=12
end
#~
最后修改日期:2020年5月23日

留言

撰写回覆或留言