2014-10-16 5 views
0

Вопрос: существует ли (более простой) способ создания пользовательских деревьев синтаксического анализа во время разбора в ANTLR v4?Создание пользовательских деревьев синтаксиса в ANTLR v4

Я думаю, что можно было бы переходить и переписывать автоматически построенное дерево, но мне было интересно, можем ли мы по-прежнему выполнять ручное построение дерева (или настройку, если на то пошло) во время разбора (аналогично ANTLR v3 и ealier). Идея состоит в том, что в зависимости от того, как пишет грамматика, мы получаем много бесполезных узлов в дереве, построенных ANTLR, и, хотя я понимаю, что вы можете переопределить только интересующие вас методы слушателя, нужно еще проверить и пропускать бесполезные типы токенов и т. д.

ответ

2

Нет, наш опыт работы с ANTLR 3 - это руководство по эксплуатации, которое неизбежно привело к созданию кода, который было сложнее в обслуживании и понимании, что привело к высокой частоте ошибок регрессии для разработчиков, вносящих какие-либо изменения к грамматике. Токены больше не удаляются из дерева, так как трудно определить, какие терминалы понадобятся в будущих выпусках приложения, и вы не хотите изменять/проверять весь свой код, работающий в дереве разбора, если терминал, который ранее не использовался, теперь требуется новым компонентом или функцией.

+0

Спасибо за прояснение! У вас есть сильная сторона с отсутствием кода клиента, когда вы меняете/реорганизовываете какое-то правило грамматики ... Я думал с точки зрения производительности, но я думаю, что накладные расходы обычно близки к нулю. –

+0

@OctavianTheodor Нынешний дизайн ANTLR 4 не оказался значительным ограничением производительности под моими оценками, и это то, что я все, кроме навязчивой. Другие области, включая фактическую структуру самих правил (взгляд, двусмысленность и т. Д.), Всегда имеют более выраженный эффект. –

2

Вы можете переопределить org.antlr.v4.runtime.Parser.addContextToParseTree(), чтобы получить контроль над тем, какие узлы создаются. Не уверен, что это совсем не то, что вы подразумеваете под обычаем.

@parser::members { 

@Override 
protected void addContextToParseTree() { 
    // code is a rule enabled by semantic predicate 'full' 
    // that matches generic lines of code. 
    if(!full && _ctx instanceof CodeContext){ 
     return; 
    } 

    // otherwise add the node to the tree.. 
    super.addContextToParseTree(); 
} 

} 
+0

Спасибо! В то время как я перешел от этой «проблемы», это кажется действительно приятным уловом. (на самом деле он еще не пробовал, но, проверяя https://github.com/antlr/antlr4/blob/master/runtime/Java/src/org/antlr/v4/runtime/Parser.java, я бы сказал, что вы right!) –

+0

Не стоит беспокоиться - похоже, я работаю для меня до сих пор - мое приложение кэширует деревья синтаксического анализа, и поскольку мне нужны только они для информации таблицы символов (определения функций/переменных), способность создавать редкое дерево экономит значительные пространство-время. – mounds