【问题标题】:Semantic rules in compiler编译器中的语义规则
【发布时间】:2016-03-13 05:34:28
【问题描述】:

我对语法定向定义 (SDD) 和语法定向翻译 (SDT) 期间使用的语义规则感到困惑。

我们如何获得语义规则?是不是就像语言需要开发者指定的语法一样。

【问题讨论】:

    标签: compiler-construction


    【解决方案1】:

    好吧,为了不让你感到困惑,你必须从头开始。

    你已经知道,为了指定一种语言,在词汇和句法层面,你必须有不同的结构,它们是tokens(主要由正则表达式实现),它指定了词汇结构一些代码和(context free) grammar,它在语法级别指定一些代码的结构(为编译器的后期阶段提供更易于处理的表示 - abstract syntax tree - 同时进行语法完整性检查,即确保输入有效且没有语法错误)。

    例如,假设你有以下小代码sn-p:

    int c = a + 5;
    

    然后在词法分析结束时,您有以下标记(假设在您的语言规范中存在与它们相似的实际标记定义,但现在让我们保持简单):

    INT(int)
    IDENTIFIER(c)
    OPERATOR(=)
    IDENTIFIER(a)
    OPERATOR(+)
    NUMBER(5)
    STATEMENT_TERMINATOR
    

    然后将其传递给解析器,解析器创建以下语法树:

         =
        / \
       /   \
      c     +
           / \
          a   5
    

    虽然到现在为止,您已经认识到这种语言结构是有效且格式良好的,但是您没有做任何事情来推导它的含义。 + 运算符代表什么? a 代表什么? = 代表什么(作为一个动作)?该操作在语义上是否有效(即您没有添加字符和数字)?

    因此,您还需要为语言指定semantic rules。

    此时我们到达Syntax Directed Definition(也称为Attribute Grammar)。 Syntax Directed Definition 是我们之前用来进行解析的Context-Free Grammar(为什么要发明一种新的符号,当我们已经有一个非常好的符号来完成我们的工作时),但是增加了 @987654335 @ 附加到grammar symbols,semantic rules 附加到产品。

    例如,包含我们上面代码的语言的上下文无关语法可能具有生产规则:

    E --> E1 + T
    E --> <identifier>
    T --> <number>
    

    在这种情况下,我们的语法导向定义(使用综合属性)将是这样的:

    E --> E1 + T       { E.val = E1.val + T.val; }
    E --> <identifier> { E.val = identifier.val; }
    T --> <number>     { T.val = number.val; }
    

    表示最终表达式将通过将第一个表达式的值加上加号运算符右侧的项的值以及指定如何获取标识符的值的规则来获得其值表达式和术语因子。

    【讨论】:

    • 这个合成属性是编译器在这个过程中创建的吗?
    猜你喜欢
    • 2016-09-04
    • 2015-02-03
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2012-02-01
    • 2021-06-11
    相关资源
    最近更新 更多