Parsing 解析成员表达式的语法

Parsing 解析成员表达式的语法,parsing,compiler-construction,abstract-syntax-tree,Parsing,Compiler Construction,Abstract Syntax Tree,标准成员表达式的正确语法是什么 例如,代码中的ast: test.test.function() 会是 MemberExpression(“测试”,MemberExpression(“测试”,MethodCall(“函数”))) 同样,对于一个变量: test.test.test.variable MemberExpression(“test”,MemberExpression(“test”,MemberExpression(“test”,Variable(“Variable”))))取决于语言

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

例如,代码中的ast:

test.test.function()

会是

MemberExpression(“测试”,MemberExpression(“测试”,MethodCall(“函数”)))

同样,对于一个变量:

test.test.test.variable


MemberExpression(“test”,MemberExpression(“test”,MemberExpression(“test”,Variable(“Variable”))))
取决于语言,当然:-),但在大多数语法中,它是非常直接的(见下文)

不过有一条评论。如下面的语法所示,成员访问(如函数调用和订阅)的行为类似于后缀运算符;点后的符号(或箭头,在类似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
/
这个
参数;处理这个问题有各种策略。对比Java、Python和Lua三种完全不同的策略。)

总之,这里有几个简单的语法片段:

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

感谢您的详细回复。请澄清关于C语法,对于这个后缀表达式,二进制运算符语法是什么。是
后缀表达式+后缀表达式
,还是所有表达式都有一个更大的语法组,包括可能在C语言中使用的后缀表达式tead?@Tom:C语法通常以级联优先样式编写。C有很多优先级别,每个级别都有自己的语法变量。AST不一定反映这一点;根据您的首选项,您可能有一些节点中的运算符是属性,或者不同运算符或组合的不同节点类型无论如何,C语法在网上很容易找到。 postfix-expression:   primary-expression   postfix-expression '[' expression ']'   postfix-expression '(' argument-expression-listopt ')'   postfix-expression '.' identifier   postfix-expression '->' identifier   postfix-expression '++'   postfix-expression '--' primary:   primary '.' NAME   primary '(' [arguments] ')'   primary '[' slices ']'   primary genexp   atom