代码之家  ›  专栏  ›  技术社区  ›  RCIX

为AST编写树语法

  •  3
  • RCIX  · 技术社区  · 15 年前

    我的语法文件为一些Lua代码输出了一个AST,它目前为我进行解析和词法分析。我想给它添加一个树语法,但是由于我使用的是C,所以我不知道该怎么做。当您已经编写了解析器和lexer时,生成树语法代码的基本过程是什么?

    更新:我有以下语法文件:

    tree grammar LuaGrammar;
    
    options {
      backtrack=true;
      language=CSharp2;
      //output=AST;
      tokenVocab=Lua;
      filter=true;
      ASTLabelType=CommonTree;
    }
    @lexer::namespace{/*my namespace*/}
    @parser::namespace{/*my namespace*/}
    
    dummyRule
        :   ^('=' x=. y=.) {};
    

    和我的主语法文件放在同一个目录中,这会产生很好的结果。但是,在尝试编译时,我会得到以下错误:

    [02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:12:18: unknown or invalid action scope for tree grammar: lexer
    [02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:13:19: unknown or invalid action scope for tree grammar: parser
    

    我是在正确的轨道上还是完全偏离?

    2 回复  |  直到 15 年前
        1
  •  1
  •   chollida    15 年前

        2
  •  2
  •   chollida    15 年前

    class CalcTreeShaker extends TreeParser;
    
    expr returns [float r]
    {
    float a,b;
    r=0;
    }
    :   #(PLUS a=expr b=expr)   {r = a+b;}
    |   #(STAR a=expr b=expr)   {r = a*b;}
    |   i:INT           {r = Convert.ToSingle(i.getText());}
    ;
    

    expr

    PLUS STAR INT

    #(...)

    {...}

    return [...]

    // Get the ast from your parser.
    CommonAST t = (CommonAST)parser.getAST();
    
    // Create the Tree Shaker
    CalcTreeWalker walker = new CalcTreeWalker();
    CalcParser.initializeASTFactory(walker.getASTFactory());
    
    // pass the ast to the walker and call the top level rule.
    float r = walker.expr(t);