使用C#和gppg,我将如何构造一个抽象语法树?

时间:2008-11-14 16:47:14

标签: c# syntax tree abstract gppg

有没有办法在开箱即用的情况下做到这一点?

我可以去编写一个大方法,使用收集的标记来确定哪些树叶应放在哪个分支中,最后填充TreeNode对象,但由于gppg已经通过使用提供的正则表达式处理了所有内容,想知道是否有更简单的方法?即使没有,任何关于如何最好地解决创建AST问题的指针都将受到赞赏。

道歉,如果我说傻话,我只是刚开始玩编译游戏。 :)

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

  1. 在语法文件中声明一个属性,该属性将保留AST的根目录:

    {%
    public BatchNode Batch;
    public ErrorHandler yyhldr;
    private TransformationContext _txContext = TransformationContext.Instance;
    %}
    
  2. 开始用构建AST节点的动作编写语法:

    Batch
        : StatementList {Batch = new BatchNode($1.Statements);}
        ;
    
    StatementList
        : Statement {$$.Statements = new List<StatementNode>(); $$.Statements.Add($1.Statement); }
        | StatementList Statement   {$$.Statements = $1.Statements; $$.Statements.Add($2.Statement);}
        ;
    
  3. 调用解析器:

    var parser = new Parser.Parser();
    var scanner = new Scanner();
    parser.scanner = scanner;
    scanner.SetSource(sourceString, 0);
    bool result = parser.Parse();
    if (result)
        HandleMyAst(parser.Batch)
    

答案 2 :(得分:0)

看看ANTLR,几年前我用C#编写了一个简单的.NET编译器。