如何制作符号表

2024-02-18

我们的任务是制作一个编译器。我们已经进行了词法和语法分析,但我们仍停留在中间代码的生成上。我们意识到我们必须实现一个符号表才能进行中间代码生成,但我们不知道如何做到这一点以及它包含什么。

给出下面的代码,符号表应该包含什么? (该代码是用教育语言编写的,如下所述)

另外,我们如何在符号表中实现范围?

<PROGRAM> ::= PROGRAM ID <BLOCK> ENDPROGRAM
<BLOCK> ::= {<DECLARATIONS> <SUBPROGRAMS> <SEQUENCE>}
<DECLARATIONS> ::= ε | DECLARE <VARLIST> ENDDECLARE
<VARLIST> ::= ε | ID ( , ID )*
<SUBPROGRAMS> ::= ( <PROCORFUNC> ) *
<PROCORFUNC> ::= PROCEDURE ID <PROCORFUNCBODY> ENDPROCEDURE |
FUNCTION ID <PROCORFUNCBODY> ENDFUNCTION
<PROCORFUNCBODY> ::= <FORMALPARS> <BLOCK>
<FORMALPARS> ::= ε | ( <FORMALPARLIST> )
<FORMALPARLIST> ::= <FORMALPARITEM> ( , <FORMALPARITEM> )*
<FORMALPARITEM> ::= IN ID | INOUT ID
<SEQUENCE> ::= <STATEMENT> ( ; <STATEMENT> )*
<STATEMENT> ::= ε | <ASSIGNMENT-STAT> |
<IF-STAT> |
<WHILE-STAT> |
<FOR-STAT> |
<EXIT-STAT> |
<CALL-STAT> |
<RETURN-STAT>
<ASSIGNMENT-STAT> ::= ID := <EXPRESSION>
<IF-STAT> ::= IF <CONDITION> THEN <SEQUENCE> <ELSEPART> ENDIF
<ELSEPART> ::= ε | ELSE <SEQUENCE>
<WHILE-STAT> ::= DO {<SEQUENCE>} WHILE (<CONDITION>)
<FOR-STAT> ::= (<ASSIGNMENT-STAT>; <CONDITION>;<ASSIGNMENT-STAT>;)
{<SEQUENCE>}
<EXIT-STAT> ::= EXIT
<CALL-STAT> ::= CALL ID <ACTUALPARS>
<ACTUALPARS> ::= ( <ACTUALPARLIST> ) | ε
<ACTUALPARLIST> ::= <ACTUALPARITEM> ( , <ACTUALPARITEM> )*
<ACTUALPARITEM> ::= IN <EXPRESSION> | INOUT ID
<RETURN-STAT> ::= RETURN <EXPRESSION>
<CONDITION> ::= <BOOLTERM> (OR <BOOLTERM>)*
<BOOLTERM> ::= <BOOLFACTOR> (AND <BOOLFACTOR>)*
<BOOLFACTOR> ::= NOT [<CONDITION>] | [<CONDITION>] |
<EXPRESSION> <RELATIONAL-OPER> <EXPRESSION> |
TRUE | FALSE
<EXPRESSION> ::= <OPTIONAL-SIGN> <TERM> ( <ADD-OPER> <TERM>)*
<TERM> ::= <FACTOR> (<MUL-OPER> <FACTOR>)*
<FACTOR> ::= CONSTANT | (<EXPRESSION>) | ID <IDTAIL>
<IDTAIL> ::= ε | <ACTUALPARS>
<RELATIONAL-OPER> ::= = | < ( ε | = | > ) | > ( ε | = )
<ADD-OPER> ::= + | -
<MUL-OPER> ::= * | /
<OPTIONAL-SIGN> ::= ε | <ADD-OPER>
PROGRAM MULTIPLY
    {
    DECLARE
    A, B, C
    ENDDECLARE
    PROCEDURE Aop(INOUT A)
    {
        A=A+1;
    }
    ENDPROCEDURE
    FUNCTION Bop(IN B){
        IF [NOT[[TRUE AND FALSE]OR[TRUE]]] THEN B := 100 / 2;
        ELSE B := 100;
        ENDIF;
        RETURN B;
        }
    ENDFUNCTION
    CALL Aop(INOUT A);
    CALL Bop(IN B);
    A := 40;
    C := A * B;
    }
ENDPROGRAM

符号表将标识符(通常以范围名称为前缀)映射到有关该标识符的信息,例如其符号类型(局部变量/参数/函数/类等)、数据类型、其相对于同一标识符中其他标识符的顺序符号表可以通过遍历抽象语法树来生成,方法是始终跟踪您所处的范围,并在每次点击变量声明时向符号表添加信息。在您的示例中,符号表的一部分可能如下所示(映射到符号类型、数据类型、位置和源代码行):

MULTIPLY.A -> {"LOCAL", "INT", 0, 4}
MULTIPLY.B -> {"LOCAL", "INT", 1, 4}
MULTIPLY.C -> {"LOCAL", "INT", 2, 4}
MULTIPLY.Aop -> {"FUNCTION", "INT", 3, 4}
MULTIPLY.Aop.A -> {"INOUTPARAM", "INT", 0, 6}

现在,您可以解析所有变量引用。例如,在表达式中A := A + 1,如果您知道当前范围是MULTIPLY.Aop,符号表会让你发现这个A是类型的输入/输出参数INT,并且它是第一个参数(此信息将让您生成堆栈地址偏移量,以便您可以加载/存储变量)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何制作符号表 的相关文章

随机推荐

  • TinyMCE - 在底部插入内容

    我知道我们可以通过这种方式将代码插入到顶部 ed selection setCursorLocation ed getBody firstChild 0 但是 我不确定如何在底部的内容中实现这一点 您可以使用以下内容DOMUtils add
  • 未知大小/参数类型的元组

    我需要创建一个映射 从整数到元组集合 单个集合中的元组具有相同的大小 问题是元组的大小及其参数类型可以在运行时确定 而不是编译时确定 我正在想象这样的事情 std map
  • Apache Spark 中失败的任务是否会重新提交?

    Apache Spark 中失败的任务是否会自动重新提交给同一个或另一个执行器 是的 但是有一个最大失败次数的参数设置 spark task maxFailures 4 Number of individual task failures
  • 将模型传递给局部视图?

    这是我的部分 model RazorSharpBlog Models MarkdownTextAreaModel div class wmd panel div div Html TextAreaFor m gt m Name new id
  • emacs 23 python.el 自动缩进样式——可以配置吗?

    我使用 emacs 23 python el 已经一个多月了 我对默认的自动缩进设置不满意 目前 我的 Python 文件自动缩进如下 x a function with dict parameter test Here is a valu
  • 带有时间戳和日期字段的 JPA 选择查询无法检索结果

    我正在尝试使用 JPA 查询获取记录 该查询在 WHERE 子句中具有 DATE 和 TIMESTAMP 列 但不知何故 日期和时间戳列无法从数据库中检索任何内容 代码段 String sql Select F from FIN TABLE
  • json_encode 将带有 Unicode(版权)字符的字符串编码为 null?

    我在对特殊字符进行 JSON 编码时遇到问题 这些字符在我的计算机 记事本 浏览器甚至我的数据库中正常显示 但是 它们不进行 JSON 编码 示例如下 site com 之后的版权符号使 JSON 字符串回显为 copyright str
  • 所有实体的 Spring Data Redis 全局 TTL

    我需要为我拥有的每个实体设置全局 TTL 并且它应该可以在一个地方进行配置 有机会通过 RedisHash 注释来做到这一点 RedisHash value persons timeToLive 100 public class Perso
  • 在全屏 JavaFX 中更改场景

    我是 JavaFX 新手 我有我的主要场景和次要场景 当我从第一个场景更改为第二个场景时 窗口的栏变得可见 我该如何解决这个问题 这是我的代码 public class ProyectoTeoriaBD1 extends Applicati
  • 如何使用反斜杠 x \x 代码解码 ascii 字符串

    我正在尝试从巴西葡萄牙语文本中解码 德迈斯子fun xc3 xa7 xc3 xb5es 12 它应该是 德迈斯子函数 12 gt gt a decode unicode escape gt gt a encode unicode escap
  • 使用 DeviceIoControl 函数读取 MBR 时出现问题

    我在调用 DeviceIoControl 函数读取可移动设备的 MBR 时遇到错误 错误代码是5 这意味着访问被拒绝 我使用的是Windows XP SP2 include stdafx h include
  • 在 SwiftUI 中动态获取视图的 Shape

    使用 Swift 5 2 我想创建一个函数来动态更改Shape 我有一个像 import SwiftUI struct CardView View let suit Suite let rank Rank var body some Vie
  • 如何在 AWS Powershell 脚本中使用 KMS 密钥加密数据

    我正在尝试使用 AWS KMS 加密文本并创建 powershell 脚本 所以我用了New KMSDataKey加密我的 KMS 主密钥 该密钥在输出中返回plaintextDataKey and ciphertextblob 现在我正在
  • 在 Assembly 中实现流程“(1) if {...} else if {...} ... (2)”

    我在 C 中有以下流程 some stuff1 if something1 func1 func2 else if something2 func3 func4 some stuff2 我想知道如何在汇编中对其进行编码 我的意思是 不是精确
  • Windows 控制台%DATE% 数学

    我想将 Windows 批处理文件中的日期设置为从今天起 7 天前 我想按照以下格式执行此操作 set today date 10 4 date 4 2 date 7 2 有什么想法如何减去这里的 7 天时间增量吗 我前段时间在某个网站上发
  • php fputcsv 在 CSV 中使用分号分隔符

    我编写了一段代码 从数据库检索数据并使用函数 fputcsv 将它们填充到 CSV 中 我把以下内容放在上面 file fopen internal customer info csv w 然后我检索数据并将它们放入变量中 运行该函数 cu
  • 意外的 NSAutoresizingMaskLayoutConstraint 将 UIView 从笔尖添加到自动布局故事板场景

    我在 IB 中有以下内容 并且两个视图都打开了 使用自动布局 并关闭了 调整子视图大小 我只是尝试将自动布局视图的实例添加到容器视图中 以便其边缘与其容器视图的边缘相交 容器视图启用了 使用自动布局 并且高度相同 但宽度是其两倍 这是代码
  • Flutter - 在 CustomPainter 上获取触摸输入

    我有一个简单的 CustomPaint CustomPainter 来绘制一段圆 代码如下 我读到我无法使用 GestureDetector 因为它不是一个合适的小部件 那么获取输入的最佳方式是什么 我将把一堆片段放在一起 所以我需要像素精
  • 页面上的 WPF KeyDown 事件

    我有一个NavigationWindow with Page 页面 XAML
  • 如何制作符号表

    我们的任务是制作一个编译器 我们已经进行了词法和语法分析 但我们仍停留在中间代码的生成上 我们意识到我们必须实现一个符号表才能进行中间代码生成 但我们不知道如何做到这一点以及它包含什么 给出下面的代码 符号表应该包含什么 该代码是用教育语言