如何写一个简单的解释器(Interpreter)-9

今天要如何解析和解释Pascal语言的定义、复合语句、赋值语句、变量。还要聊聊符号表以及存储和查找变量。

 

BEGIN
    BEGIN
        number := 2;
        a := number;
        b := 10 * a + 10 * number / 4;
        c := a - - b
    END;
    x := 11;
END.

你看,不只是数学计算了,还多了一些眼熟的编程语言或者说计算机系学生特有的知识:

  1. Pascal程序的定义是一串复合的语句,加上一个句号。比如:

     
    “BEGIN  END.”
    

    事先声明,这并不是一个完整的程序声明,后面会扩充它。

  2. 复合语句是什么意思呢?一个复合语句指的是一块代码,被BEGIN和END包起来的一系列语句,也可以是其他复合语句。在复合语句中的每一个语句,除了最后一个,都是分号结束的。最后一个语句可能有,也能没有分号。下面是一些例子:

“BEGIN END”
“BEGIN a := 5; x := 11 END”
“BEGIN a := 5; x := 11; END”
“BEGIN BEGIN a := 5 END; x := 11 END”

可以看到:

  1. 语句列表是一系列的语句。

  2. 一个语句,可以是一个符合语句,一个赋值语句,也可以是一个空语句。

  3. 赋值语句就是一个变量后面跟着赋值token,也就是一个冒号一个等号。比如 “a := 11” “b := a + 9 - 5 * 2”

  4. 一个变量是一个标识符。我们使用ID token来表示变量。token的值是一个变量的名字,比如a、number等等。这个a和b就是变量。“BEGIN a := 11; b := a + 9 - 5 * 2 END”

  5. 空的语句表示不再继续产生新的东西了。在解析器里,我们使用empty_statement语法规则去表示语句列表的结束,空语句用‘’BEGIN END‘’表示。

  6. factor规则也升级了,可以处理变量了。

完整的语法是这么严肃的表示的:

    program : compound_statement DOT

    compound_statement : BEGIN statement_list END

    statement_list : statement
                   | statement SEMI statement_list

    statement : compound_statement
              | assignment_statement
              | empty

    assignment_statement : variable ASSIGN expr

    empty :

    expr: term ((PLUS | MINUS) term)*

    term: factor ((MUL | DIV) factor)*

    factor : PLUS factor
           | MINUS factor
           | INTEGER
           | LPAREN expr RPAREN
           | variable

    variable: ID

You probably noticed that I didn’t use the star ‘*’ symbol in the compound_statement rule to represent zero or more repetitions, but instead explicitly specified the statement_listrule. This is another way to represent the ‘zero or more’ operation, and it will come in handy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值