使用 C# 和 gppg,如何构建抽象语法树?

发布于 2024-07-08 18:02:05 字数 218 浏览 14 评论 0原文

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

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

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

Is there a way to do this almost out-of-the-box?

I could go and write a big method that would use the collected tokens to figure out which leaves should be put in which branches and in the end populate a TreeNode object, but since gppg already handled everything by using supplied regular expressions, I was wondering if there's an easier way? Even if not, any pointers as to how best to approach the problem of creating an AST would be appreciated.

Apologies if I said anything silly, I'm only just beginning to play the compiler game. :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

ぽ尐不点ル 2024-07-15 18:02:05
  1. 在语法文件中声明一个属性,该属性将保留 AST 的根:

    <前><代码>{%
    公共 BatchNode 批处理;
    公共错误处理程序 yyhldr;
    私有 TransformationContext _txContext = TransformationContext.Instance;
    %}

  2. 开始使用构建 AST 节点的操作编写语法:

    批处理 
          : StatementList {Batch = new BatchNode($1.Statements);} 
          ; 
    
      声明列表 
          : 语句 {$.Statements = new List();   $.Statements.Add($1.Statement);   } 
          |   StatementList 语句 {$.Statements = $1.Statements;   $.Statements.Add($2.Statement);} 
          ; 
      
  3. 调用解析器:

    var parser = new Parser.Parser(); 
      var Scanner = new Scanner(); 
      解析器.scanner = 扫描器; 
      扫描仪.SetSource(sourceString, 0); 
      布尔结果 = parser.Parse(); 
      如果(结果) 
          HandleMyAst(解析器.Batch) 
      
  1. In your syntax file declare a property which will keep the root of your AST:

    {%
    public BatchNode Batch;
    public ErrorHandler yyhldr;
    private TransformationContext _txContext = TransformationContext.Instance;
    %}
    
  2. Start writing your grammar with actions which build nodes of your 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. Call parser:

    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)
    
寄与心 2024-07-15 18:02:05

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

Take a look at ANTLR, I did a simple .NET compiler written in C# with it few years back.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文