如何使用JJTree实现给定语法的AST

问题描述 投票:0回答:1

我正在尝试从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个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.