Рубрики
Без рубрики

Antlr4 генератор синтаксического анализа Java советы

Я новичок в Antlr (и любых других генераторах синтаксических анализаторов;_;), поэтому мне потребовалось некоторое время, чтобы ознакомиться с… С тегами java, antlr, antlr4.

Я новичок в Antlr (и любых других генераторах синтаксических анализаторов;_;), поэтому мне потребовалось некоторое время, чтобы ознакомиться с синтаксическим анализатором, лексером и посетителем. Здесь я записываю некоторые советы, которые могут оказаться полезными в будущем.

  • Избегайте нескольких правил лексера, которые соответствуют одному и тому же шаблону , иначе одно из них никогда не будет сопоставлено. В моем синтаксическом анализаторе есть два узла и вес, где все они являются числами, но я подумал, что, поскольку они являются разными элементами, я должен использовать разные правила лексера для каждого из них, например, следующие:
tuple
    : nodefrom weight nodeto
    ;
nodefrom: [0-9]+;
weight: [0-9]+;
nodeto: [0-9]+;

И это вызывает несоответствие. Чтобы избежать этого, лучше использовать только одно правило лексера для целых чисел:

tuple
    : nodefrom weight nodeto
    ;
nodefrom: INT;
weight: INT;
nodeto: INT;
INT: [0-9]+;
  • Поскольку в грамматике может быть несколько операций, поэтому нам нужно добавить теги (оператор#) для каждого из них, что приводит к отдельной функции посетителя. Например,
expr
    : expr '*'         #aster
    | expr '.' expr    #concate 
    | expr '+' expr    #plus
    | tuple            #tup
    | '(' expr ')'     #parens
    ;

Это часть моего синтаксического анализатора, который использует 3 операции: звездочку, объединение и плюс. С помощью #aster, #concrete и #or он создаст интерфейсы visit Aster(), visitConcate() и visit Plus(), а затем мы сможем реализовать эти операции отдельно. Если мы не создадим эти теги, будет создан только один интерфейс – visitExpr().

  • При реализации методов для класса visitor нам нужно сосредоточиться только на тех, которые связаны со значениями, которые мы хотим вычислить при обходе дерева синтаксического анализа . Например, в моем дереве синтаксического анализа каждый узел представляет собой кортеж (Узел 1, Вес_1, Вес_2, Узел 2) , и для каждого значения существуют методы посещения. Если посетителю, которого я создаю, требуется только Weight_1 для вычисления, то мне нужно специально реализовать функцию visit Weight_1().

  • Я обнаружил, что этот класс посетителей действительно удобен, где он автоматически генерирует метод для каждого правила синтаксического анализа, и вы можете получить значение одного узла просто с помощью ctx. Имя значения() . Поэтому, когда я пишу код для методов посетителей, я всегда запускаю grun Calc prog – графический интерфейс calc.txt чтобы открыть визуализированное дерево синтаксического анализа и проверить взаимосвязь между этими узлами. Это часть дерева синтаксического анализа, которое я использую. В кортеже есть 6 элементов, (nodef, wc, wd, nodet) (включая скобки). Так что, если прямо сейчас я хочу получить значение wc в функции visitTuple(Синтаксический анализатор. Контекст кортежа ctx) , я могу написать что-то вроде ctx.wc() .

Все еще работает…

Оригинал: “https://dev.to/tinjiklau/antlr4-parser-generator-java-tips-4kp8”