LINUX.ORG.RU

yacc: token


0

0

Вопрос такой:
есть файл ххх.у . В нём строчки:

%token TOK_1 TOK_2 TOK3
TOK_4 TOK5
TOK_6
...........
и т.д.

1. Имеет ли значение, что токены 4, 5, 6 расположены на другой строке?
2. Различаются ли как-нибудь по приоритету токены 4, 5 от 1, 2, 3
а также 6 от 4, 5 или нет?
3. Допустим, я удаляю токены 1, 2, 4. Строки выглядят так:
TOK_3
TOK_5
TOK_6
Удаляю соответственно правила, связанные с токенами 1, 2, 4.
Это не проходит - выдаёт ошибку. Если их поместить в 1 строчку -
то ошибки нет. Но я не знаю, правильно ли так, поскольку в первоначальном варианте они были на разных строках. Помогите, пожалуйста!


AFAIK список токенов в yacc должен начинаться с %token. Так что если строчка начинается сразу с токена - то это ошибка.
Если ты хочешь редактировать список токенов путем удаления или комментирования строк, то это обычно делается путем размещения одного токена в каждой строке:
%token Token1
%token Token2
%token Token3
...
%token TokenN

Да, кроме yacc есть еще и antlr - там лучше поддержка C++


Flogger_d
()
Ответ на: комментарий от Flogger_d

Понимаешь ... оно работало!! Программа работает, если строки выглядят так (цитирую кусок кода):
%token TOK_ABSTRACT
TOK_AGGREGATE TOK_ALIAS
TOK_ALL_IN TOK_ARRAY
TOK_AS TOK_ASSIGNMENT
TOK_BACKSLASH
TOK_BAG TOK_BEGIN TOK_BINARY

Я прошу объяснить почему на одной строке 1 токен, на другой 2, а на другой 3. Мне непонятно, как yacc различает их или не различает.
Может быть в этом куске токены разделили по смыслу, а для yacc'a может быть всё равно, в одну строчку или нет. Это я и пытаюсь понять.
Дело в том, что при удалении некоторых токенов не работала программа, если из 3-х удаляешь 1 или 2. А если я соединял 3 токена, которые были на разных строках, в одну строку - программа работала. Но явно не так, как хотелось бы. Как yacc интерпретирует последовательность, которую я привёл в качестве примера??

RomanU
() автор топика
Ответ на: комментарий от RomanU

Попробовал - действительно работает. Видимо, %token устанавливает некое
состояние, в котором любой идентификатор считается декларацией нового
токена. Видимо это состояние должно действовать до очередного %token
или %type etc

Flogger_d
()

Да, а что за ошибка выдается? Ее выдает именно yacc? Или нужно было
после изменений *.y перегенерить y.tab.h (-d) ?

Flogger_d
()
Ответ на: комментарий от Flogger_d

да я перекомпиливаю все исходники потом, в том числе и yacc'овские.
Хочу понять, различает ли yacc каким-либо образом два токена на одной строке, три, и т.д. или один, или никак не различает?
Если различает, то как? А если не различает, то почему когда у меня 3 токена, каждый в новой строке, программа глючит (говорит, что в разбираемом файле синтаксическая ошибка в 1-й строке, но там всё корректно), а если я их в одну строку записываю - не глючит, но вылетает просто (Terminated) ?

RomanU
() автор топика
Ответ на: комментарий от RomanU

1. По каждому токену yacc генерирует #define; в этом смысле ему безразлично, сколько их и как они расположены,

2. Легко проверить, что yacc свое дело делает правильно (т.е. одинаковым образом) в обоих случаях -- сохраните y.tab.c и сравните.

3. Глюки с построенной программой скорее всего связаны с неправильной сборкой (makefile плохо написан).

vnp
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.