【问题标题】:How to implement an AST given a grammar with JJTree如何使用 JJTree 实现给定语法的 AST
【发布时间】:2019-03-07 10:43:44
【问题描述】:

我正在尝试实现一个从 LaTeX 到 HTML 的解析器,为了完成我的练习,我需要编写一个 JavaCC 语法,生成抽象语法树并实现一个访问者来解析代码。

我已经编写了我的 .jj 语法文件,现在我对如何使用 jjtree 生成基于语法文件的 AST 感到困惑。任何人都可以帮助我吗? 这是我的语法文件,如果有帮助的话。

ArrayList<LaTeXObject> LaTeX() :
{
    ArrayList<LaTeXObject> objects;
}
{
    objects = ObjectList() <EOF>

    {
        return objects;
    }
}

ArrayList<LaTeXObject> ObjectList() :
{
    ArrayList<LaTeXObject> objects = new ArrayList<LaTeXObject>();

    LaTeXObject object;
}
{
    ( object = Object() { objects.add(object); } )*

    {
        return objects;
    }
}

LaTeXObject Object() :
{
    LaTeXObject object;
}
{
    (
        object = Command()
        |
        object = Group()
        |
        object = String()
    )

    {
        return object;
    }
}

LaTeXCommand Command() :
{
    String name;
}
{
    <BACKSLASH>
    (
        name = Name() Whitespace()
        |
        name = SpecialCharacter()
        |
        name = NonSpecialCharacter()
    )

    {
        return new LaTeXCommand(name);
    }
}

String Name() :
{
    StringBuilder sb = new StringBuilder();

    Token token;
}
{
    token = <ASCII_LETTER> { sb.append(token.image); } ( LOOKAHEAD( <ASCII_LETTER> ) token = <ASCII_LETTER> { sb.append(token.image); } )*

    {
        return sb.toString();
    }
}

void Whitespace() :
{}
{
    ( LOOKAHEAD( WhitespaceCharacter() ) WhitespaceCharacter() )*
}

String WhitespaceCharacter() :
{
    Token token;
}
{
    token = <WHITESPACE>

    {
        return token.image;
    }
}

String SpecialCharacter() :
{
    Token token;
}
{
    (
        token = <BACKSLASH>
        |
        token = <LBRACE>
        |
        token = <RBRACE>
        |
        token = <SPECIAL>
    )

    {
        return token.image;
    }
}

String NonSpecialCharacter() :
{
    Token token;
}
{
    token = <NON_SPECIAL>

    {
        return token.image;
    }
}

LaTeXGroup Group() :
{
    ArrayList<LaTeXObject> objects;
}
{
    <LBRACE> objects = ObjectList() <RBRACE>

    {
        return new LaTeXGroup(objects);
    }
}

LaTeXString String() :
{
    StringBuilder sb = new StringBuilder();
    String string;
}
{
    string = TextCharacter() { sb.append(string); } ( LOOKAHEAD( TextCharacter() ) string = TextCharacter() { sb.append(string); } )*

    {
        return new LaTeXString(sb.toString());
    }
}

String TextCharacter() :
{
    Token token;
}
{
    (
        token = <WHITESPACE>
        |
        token = <NON_SPECIAL>
        |
        token = <SPECIAL> 
        |
        token = <ASCII_LETTER>
        |
        token = <ASCII_DIGIT>
        |
        token = <LATIN_SUPPLEMENT>
        |
        token = <UNICODE_LETTER>
    )

    {
        return token.image;
    }
}

【问题讨论】:

    标签: grammar javacc


    【解决方案1】:

    所以你现在所拥有的确实构建了一个抽象语法树。如果您对此感到满意,则根本不需要 JJTree。

    如果你真的想使用 JJTree,你应该去掉所有构成LatexObjectobjects 的代码。只需让您所有的非终端产品返回void。还将文件从.jj 重命名为.jjt。现在以 .jjt 文件作为输入运行 JJTree。低,你会看到一个新的.jj 文件,它构建了一个抽象语法树。现在摆弄.jjt 文件,直到它生成的抽象语法树是您满意的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多