2

有没有办法做到这一点几乎是开箱即用的?

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

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

4

3 回答 3

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)
    
于 2010-05-06T00:39:21.917 回答
1

见 Mgrammar 和奥斯陆...

http://msdn.microsoft.com/oslo

http://channel9.msdn.com/pdc2008/TL31/

于 2008-11-14T17:04:55.043 回答
0

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

于 2008-11-14T18:04:45.297 回答