Size: a a a

Compiler Development

2020 May 11

IK

Ivan Kochurkin in Compiler Development
Возможно предикаты, меня еще смущают {backtrack=true;memoize=true;} в каждом правиле. Если бы писали на ANTLR 4, то было бы проще профилировать и получать внимание от сообщества.
источник

АЗ

Алексей Запольский... in Compiler Development
Ivan Kochurkin
Если не секрет, а зачем вы используете устаревшую 3 версию, а не 4?
Привет, Иван.
Я хочу интеграцию с проектами C/C++ и Java. Делаю для плагина для NetBeans 8.2. А там под капотом antlr3. И вообще он построже к правилам. В 4м пропускает многие некорректные вещи, которые я обнаружил сейчас. Частично проблему решил. Было несколько неявных рекурсий в правилах. А сейчас какая-то ерунда. В сгенерированном парсере CASE input.LA(1) переходит не на то значение, которое выдает LA. То ли дебаг кривой, то ли я с Java не дружу. Шас буду в каком-нидь другом редакторе отлаживать. Что можете сказать про функции поиска токенов, которые я в @members  написал? Вы что-т о подобное использовали? И что еще можно добавить для комбинации с LR парсерами?
источник

АЗ

Алексей Запольский... in Compiler Development
Visual Studio не предлагайте, я ее потом помучаю. )
источник

СЛ

Сергей Лапынин... in Compiler Development
Алексей Запольский
Привет, Иван.
Я хочу интеграцию с проектами C/C++ и Java. Делаю для плагина для NetBeans 8.2. А там под капотом antlr3. И вообще он построже к правилам. В 4м пропускает многие некорректные вещи, которые я обнаружил сейчас. Частично проблему решил. Было несколько неявных рекурсий в правилах. А сейчас какая-то ерунда. В сгенерированном парсере CASE input.LA(1) переходит не на то значение, которое выдает LA. То ли дебаг кривой, то ли я с Java не дружу. Шас буду в каком-нидь другом редакторе отлаживать. Что можете сказать про функции поиска токенов, которые я в @members  написал? Вы что-т о подобное использовали? И что еще можно добавить для комбинации с LR парсерами?
после consume, LA(1) выдает следующий токен
источник

СЛ

Сергей Лапынин... in Compiler Development
попробуйте LA(-1)
источник

АЗ

Алексей Запольский... in Compiler Development
Да, и стал использовать antlrworks 1.5.1. Он графически показывает отключенные переходы на повторные альтернативы. В новом antlrworks 2 для antlr4 этого нет.
источник

АЗ

Алексей Запольский... in Compiler Development
Сергей Лапынин
после consume, LA(1) выдает следующий токен
Привет, Сергей. Не, я закешил LA(1) в переменную и сделал case по ней. Все равно переходит в "CASE TO"(178), я даже изменил "case to" на "case -1".  Все равно переходит в эту ветку. Очистил и пересобрал проект - тоже самое. Помучаюсь еще. )
источник

АЗ

Алексей Запольский... in Compiler Development
Там еще небезопасное преобразование в классе потока из Hash[] в Hash<Int, Int>. Может и тут глюк.
источник

СЛ

Сергей Лапынин... in Compiler Development
и еще, зачем вы используете LA на уровне парсера?
Может быть вы имели ввиду LT?
источник

АЗ

Алексей Запольский... in Compiler Development
Сергей Лапынин
и еще, зачем вы используете LA на уровне парсера?
Может быть вы имели ввиду LT?
Ну так и есть в сгенерированном парсере. Я посмотрел LA выдает int, для LTнадо делать LT(1).GetType().
источник

СЛ

Сергей Лапынин... in Compiler Development
LA выдает символ. LT - токен
источник

СЛ

Сергей Лапынин... in Compiler Development
В какой вселенной у вас код символа совпадает с типом токена?
источник

АЗ

Алексей Запольский... in Compiler Development
LA выдает инты токенов лексера прописанные в xgrammar.tokens -  они же константы в сгенерированном парсере. Т.е. если в потоке "=>" и у меня в лексере явно прописан токен "=>", то LA выдаст int для "=>", а не для "=". Я пока не посмотрел реализацию LT. Может он еще как токены правила парсера возвращает? Но с LA проверено.
источник

СЛ

Сергей Лапынин... in Compiler Development
LA(int i)
Deprecated.
Gets the value of the symbol at offset i from the current position.
источник

СЛ

Сергей Лапынин... in Compiler Development
*symbol*
источник

СЛ

Сергей Лапынин... in Compiler Development
и еще, на уровне парсера у вас поток символов может быть завершен уже. И выдавать будет -1
источник

СЛ

Сергей Лапынин... in Compiler Development
LA на уровне парсера сделан для любителей однопроходного нечто, которое будет работать 100500 лет.
источник

СЛ

Сергей Лапынин... in Compiler Development
Потому что им токены надо формировать исходя из того, что у них в парсере.
источник

АЗ

Алексей Запольский... in Compiler Development
Ну не буду же я переписывать генератор парсера в antlr3. Пока работает и норм. Я не знаю, что подразумевается в "Symbol", но работает как я описал выше. И как я понял для LA(1) не надо делать LA(-1),  а для LT надо. Я еще разбираюсь. Так вы делали подобные функции поиска токенов для создания предикатов?
       boolean TokenIsAssignmentOperator(int tok){
     if (tok == INASSIGN || tok == PLUSEQ || tok == MINUSEQ || tok == MULTEQ || tok == DIVEQ || tok == MODEQ || tok == EXPEQ)
       return Boolean.TRUE;
     return Boolean.FALSE;
 }        boolean SeekAssignmentOperator(){
           int i = 0;
           int la = 0;
           while (!TokenIsAssignmentOperator(la) && la != Crlf && la != EOF){
               i++;
               la = input.LA(i);
           }
           return TokenIsAssignmentOperator(la);
       }
источник

M

MaxGraey in Compiler Development
Алексей Запольский
Ну не буду же я переписывать генератор парсера в antlr3. Пока работает и норм. Я не знаю, что подразумевается в "Symbol", но работает как я описал выше. И как я понял для LA(1) не надо делать LA(-1),  а для LT надо. Я еще разбираюсь. Так вы делали подобные функции поиска токенов для создания предикатов?
       boolean TokenIsAssignmentOperator(int tok){
     if (tok == INASSIGN || tok == PLUSEQ || tok == MINUSEQ || tok == MULTEQ || tok == DIVEQ || tok == MODEQ || tok == EXPEQ)
       return Boolean.TRUE;
     return Boolean.FALSE;
 }        boolean SeekAssignmentOperator(){
           int i = 0;
           int la = 0;
           while (!TokenIsAssignmentOperator(la) && la != Crlf && la != EOF){
               i++;
               la = input.LA(i);
           }
           return TokenIsAssignmentOperator(la);
       }
А у вас там Boolean.TRUE == true и Boolean.FALSE == false? Если нет, то корректнее наверное возвращать Boolean enum а не boolean для TokenIsAssignmentOperator и SeekAssignmentOperator соответственно
источник