自定义语言解析器与表达式不同的类似C的类型声明

时间:2017-02-28 06:28:07

标签: python parsing abstract-syntax-tree

我一直在为自己的语言构建编译器(使用Python和LLVM实现)。到目前为止,我已经构建了一个交互式Lexer,我的解析器根据解析器的状态从一组预期的令牌中请求令牌。 来自Lexer的Parser的parseValue成员

def parseValue(self):
        """Read in a Value of any kind, including complete expressions"""
        Token = self.NextToken({
                    'OP': ['group_open'],
                    'IDENT':['VARIABLE'],
                    'NUMBER': None,
                    'STRING': None})
        if Token.Type == 'OP':
            if Token.Special == 'GROUP_OPEN':
                laststate = self.state[-1]
                numstates = len(self.state)
                self.state.append('GROUP')
                expr = praseExpr() # Should pop 'GROUP' from state
                if numstates != len(self.state) or laststate != self.state[-1]:
                    self.Abort("Unexpected State")
                return Value('EXPR', expr)
            else:
                return None
        if Token.Type == 'IDENT':
            return Value('IDENT', Token)
        elif Token.Type == 'NUMBER':
            return Value('NUMBER', Token)
        elif Token.Type == 'STRING':
            return Value('STRING', Token)
        else:
            return None

目前我已经使用shunting-yard算法实现了Expression解析  和3个成员函数parseExpr,parseValue,parseOp。

这将翻译一些复杂的表达,例如

buf = StringIO.StringIO("""\
x = 9; y = 7; z= 0.8;
k = sin(C["pi"]*x + y)*z;
type* m = y;
g[x](x,y);
""")
p = Parser(infile=buf)
while not p.EOF:
    print p.parseExpr()

以下(这是生成的AST的功能表示)

@SET(x,9)
@SET(y,7)
@SET(z,0.8)
@SET(k,@MUL(sin(@ADD(@MUL(@SUBSCRIPT(C,'pi'),x),y)),z))
@SET(@MUL(type,m),y)
@SUBSCRIPT(g,x)(x,y)
None

我会在我希望找到表达式的任何地方调用parseExpr()。但是,我不知道如何处理语句,因为语句可能是一些以关键字开头的特殊语法,即

parseStmt(self):
    Token = self.NextToken({'IDENT': ['KEYWORD']})
    if Token.Type is not None:
         # handle for keyword here
         return stmt
    # This is the same point in the file as no valid token was found, and I can then handle just expressions by
    return self.parseExpr()

所以我的问题是如何处理类型声明,因为如果type是一个对象,type* m=y是一个有效的表达式,@MUL(type, m)返回一个允许的左值,但如果type是的话,它也是一个有效的类型声明用户定义的某种类型的名称。此外,type** m=y作为类型声明有效但不是表达式,因为没有二元运算符**,因此我当前的解析器将读取type*,然后给出值预期的错误消息。这通常是正确的,因为类型声明仅在少数情况下有效。

显然我可以使用一些关键字来声明变量,但我个人更喜欢C风格的语法,这会导致关于函数定义的问题 - 关键字是否应该在那里使用。我宁愿避免这种解决方案,我希望这里有人可以提供解决这个问题的方法。由于他们要么使用生成器或者使用不同的解析模型来解析我所使用的在线文章,所以我找不到任何关于解析的内容,因此它们没有太多帮助。

0 个答案:

没有答案
相关问题