Parsing 解析成员表达式的语法
标准成员表达式的正确语法是什么 例如,代码中的ast: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”))))取决于语言
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