【问题标题】:Parse grammar for a member expression解析成员表达式的语法
【发布时间】:2021-03-04 17:48:47
【问题描述】:

标准成员表达式的正确语法是什么?

例如代码中的 ast:

test.test.function()

MemberExpression("test", MemberExpression("test", MethodCall("function")))

对于变量也是如此:

test.test.test.variable

MemberExpression("test", MemberExpression("test", MemberExpression("test", Variable("variable"))))

【问题讨论】:

    标签: parsing compiler-construction abstract-syntax-tree


    【解决方案1】:

    当然取决于语言 :-) 但在大多数语法中它是相当直接的(见下文)。

    不过,有一条评论。正如下面的语法所示,成员访问(如函数调用,通常还有下标)就像一个后缀运算符;点后面的符号(或箭头,在类 C 语言中)是表示成员名称的符号。它不是一种表达;成员查找中的唯一表达式位于运算符的左侧。所以a.b.c 应该对应一个 AST 节点,比如:

    MemberLookup(MemberLookup(Variable("a"), "b"), "c") 
    

    a.b.func(2, c)应该变成:

    MethodCall(MemberLookup(Variable("a"), "b"),
               "func",
               List(Number(2), Variable("c")))
    

    或者,也许,

    Apply(MemberLookup(MemberLookup(Variable("a"), "b"), "func"),
          List(Number(2), Variable("c"))
    

    (区别在于隐含的self/this 参数;有多种策略来处理这个问题。对比Java、Python 和Lua 三种完全不同的策略。)

    不管怎样,这里有几个简单的语法片段:

    C

    这是 C 语法的摘录(见 C 标准的附录 A:

    postfix-expression:
      primary-expression
      postfix-expression '[' expression ']'
      postfix-expression '(' argument-expression-listopt ')'
      postfix-expression '.' identifier
      postfix-expression '->' identifier
      postfix-expression '++'
      postfix-expression '--'
    

    我不仅包括成员访问函数,因为它表明.identifier->identifier 的处理方式与任何其他后缀运算符一样,这​​是一个有用的见解。相同的产生式还包括两个后缀括起来的运算符,下标 ([...]) 和函数调用 ((...)),这似乎与此处相关。但是我省略了复合文字(我会放入primary-expression)。

    Python

    Python 3.9 文档的类似摘录:

    primary:
      primary '.' NAME
      primary '(' [arguments] ')'
      primary '[' slices ']'
      primary genexp
      atom
    

    【讨论】:

    • 感谢您的详细回复。只是为了澄清 C 语法,就这个后缀表达式而言,二元运算符语法是什么。是postfix-expression + postfix-expression,还是有一个更大的语法组用于所有表达式,包括可能被使用的后缀表达式?
    • @Tom:C 语法通常以级联优先样式编写。 C 有很多优先级,每个级别都有自己的句法变量。 AST 不一定反映这一点。根据您的偏好,您可能具有运算符为属性的节点,或者不同运算符或组合的不同节点类型。
    • 反正C语法在网上很容易找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多