【发布时间】:2014-11-05 02:05:35
【问题描述】:
我正在使用第三方解析器来开发具有数组和结构的编程语言。假设 Str 是一个结构体类型变量,其中包含一个名为 A 的数组,而 I 是一个整数变量,对于如下表达式:
Str.A[I]
解析器生成以下表达式树(伪代码):
StructMember
(
Left = "Str"
Right = ArraySubscript
(
Left = "A"
Right = "I"
)
)
我期待别的东西:
ArraySubscript
(
Left = StructMember
(
Left = "Str"
Right = "A"
)
Right = "I"
)
因为在执行或生成代码时,首先解析结构成员,然后执行下标。
从理论的角度来看,首先评估的操作不应该在语法树中比接下来评估的操作更深吗?换句话说,这种行为是否应该被视为解析器中的错误?
编辑 rici:如果 StrA 是一个结构数组,这是我得到的树:
StructMember
(
Left = ArraySubscript
(
Left = "StrA"
Right = "I"
)
Right = ArraySubscript
(
Left = "A"
Right = "I"
)
)
那是表达式StrA[I].A[I]。
EDIT2:对于表达式 S.A[I].T,这是我得到的:
StructMember
(
Left = "S"
Right = StructMember
(
Left = ArraySubscript
(
Left = "A"
Right = "I"
)
Right = "T"
)
)
从执行顺序的角度来看,这也没有多大意义。
【问题讨论】:
-
您的语言是否允许您将
Foo.(X+Y)之类的东西写成Foo.X + Foo.Y的快捷方式? -
我也觉得有点奇怪,但是没有真正的 AST 理论。有时,解析要求(特别是在使用 LL 语法时)会迫使您进入一个与您不完全一样的语法,然后需要在后续通道中调整 AST。只是出于好奇,如果 A 是一个结构数组,那么 S.A[I].T 会得到什么?
-
@sepp2k:据我所知不是。
-
对我来说,您的“我期待”的假设是错误的。 AST 应该按照输入语言的语法来捕获语言输入,抽象掉标点符号、空格等。代码生成、表达式评估等通常发生在后期阶段,使用它们自己的数据结构(由 AST 构建)。因此,我认为这不是解析器错误,因为您对 AST 目的的假设是不正确的。顺便说一句:如果不指定语言,您的问题就不清楚,不能像@rici 指出的那样回答“没有真正的 AST 理论”
-
关于你的编辑:你得到那棵树的表达是什么?我不认为你输入了 rici 询问的相同表达方式。如果你输入的表达式真的包含两个
.s,那么你得到的树是完全错误的。
标签: parsing compiler-construction abstract-syntax-tree