Как реализовать AST с учетом грамматики с помощью JJTree - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь реализовать парсер из LaTeX в HTML, чтобы завершить упражнение, мне нужно написать грамматику JavaCC, сгенерировать дерево синтаксиса Abstract и реализовать посетителя для разбора кода.

Я написал свой файл грамматики .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;
    }
}

1 Ответ

0 голосов
/ 11 марта 2019

Итак, теперь у вас есть абстрактное синтаксическое дерево.Если вы довольны этим, вам совсем не нужен JJTree.

Если вы действительно хотите использовать JJTree, вы должны удалить весь код, который создает LatexObject объекты.Просто верните все свои нетерминальные произведения void.Также переименуйте файл с .jj на .jjt.Теперь запустите JJTree с вашими .jjt файлами в качестве входных данных.Низко и вот у вас будет новый .jj файл, который строит абстрактное синтаксическое дерево.Теперь возитесь с файлом .jjt, пока созданное им абстрактное синтаксическое дерево не будет таким, каким вы довольны.

...