Size: a a a

Compiler Development

2020 May 11

АЗ

Алексей Запольский... in Compiler Development
Да это так на скорую руку копипастом, надо просто прописать импорт библиотеки ява для boolean, я просто не успел посмотреть какой, - исправлю. )
источник

СЛ

Сергей Лапынин... 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);
       }
Повторяю еще раз. LA возвращает символ. Так было всегда.
Это значит, что если у вас строка
a += b
 ^
 |
В данной позиции вам LA вернет не +=, а +. Причем не эти ваши ADDQ, а ASCII код символа +
источник

p

polunin.ai in Compiler Development
Сергей Лапынин
Повторяю еще раз. LA возвращает символ. Так было всегда.
Это значит, что если у вас строка
a += b
 ^
 |
В данной позиции вам LA вернет не +=, а +. Причем не эти ваши ADDQ, а ASCII код символа +
ну если ascii, то LA возвращает следующий байт а не символ)
источник

СЛ

Сергей Лапынин... in Compiler Development
polunin.ai
ну если ascii, то LA возвращает следующий байт а не символ)
Для символа "+" представление в юникоде и ASCII - одинаковое
источник

p

polunin.ai in Compiler Development
ок
источник

АЗ

Алексей Запольский... in Compiler Development
источник

АЗ

Алексей Запольский... in Compiler Development
Сергей, посмотрите часть кода сгенерированного парсера и скажите, что я описал выше механизм работы LA  неправильно.
источник

СЛ

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

СЛ

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

СЛ

Сергей Лапынин... in Compiler Development
если бы вы писали такое:
switch (input.LA(1)) { case '+': break; case '=': break; default: } - то это было бы правильно. Правда не понятно зачем оно вам в парсере может потребоваться
источник

СЛ

Сергей Лапынин... in Compiler Development
для вашего случая надо использовать input.LT(1).getType()
источник

АЗ

Алексей Запольский... in Compiler Development
Парсер писал не я - он сгенерирован, а написанные мной @members - это часть парсера. Кста, я читая теорию очень долго путался лексема, символ, токен. А тут по коду все ясно.
источник

СЛ

Сергей Лапынин... in Compiler Development
я не знаю, кто это генерировал.
источник

АЗ

Алексей Запольский... in Compiler Development
это сненерировал antlr3.Tool ))
источник

СЛ

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

АЗ

Алексей Запольский... in Compiler Development
Инициализация "токенов" члены прям в теле парсера, а свичи во всех методах "правило_xx"()
источник

АЗ

Алексей Запольский... in Compiler Development
Кста, один из мэйнтейнеров Harbour добавил для себя кортежи в компилятор. Так я узнал, что есть язык Python. ))
источник

СЛ

Сергей Лапынин... in Compiler Development
так. во-первых больше с просонья не буду никому отвечать. во-вторых я дебил. в-третьих LA возвращает тип токена на уровне парсера.
В вашей грамматике вы жалуетесь на то, что в отладчике у вас тип указывает не на то, что хотелось бы?
Так вот, под отладчиком сидеть в парсере - дело такое себе. println и тот будет лучше.
В вашем случае, как я понял, вы хотите ускорить работу грамматики. Но есть одно но - у вас очень много кастомных лукэхедов - они тормозят работу довольно серьезно. Их не стоит использовать, особенно в начале альтернативы.
источник

СЛ

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

СЛ

Сергей Лапынин... in Compiler Development
statamentExpressionAssignment
options {backtrack=true;memoize=true;}
   : {SeekAssignmentOperator() && SeekTokenToEOL(Pipe)}? lValue assignment_operator codeBlockExt crlfStmnt!
   | {SeekAssignmentOperator()}? extLValue assignment_operator assignmentExpression crlfStmnt!
   ;

Зачем тут искать оператор присваивания?
источник