【问题标题】:Using C# and gppg, how would I construct an abstract syntax tree?使用 C# 和 gppg,我将如何构建抽象语法树?
【发布时间】:2008-11-14 16:47:13
【问题描述】:

有没有一种开箱即用的方法?

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

抱歉,如果我说了什么愚蠢的话,我才刚刚开始玩编译器游戏。 :)

【问题讨论】:

    标签: c# syntax tree abstract gppg


    【解决方案1】:

    【讨论】:

      【解决方案2】:
      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)
        

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 2011-09-03
          • 1970-01-01
          • 1970-01-01
          • 2013-07-30
          • 1970-01-01
          • 2011-09-01
          相关资源
          最近更新 更多