Бизон флекс для начинающих

Как я могу напечатать номер строки, в которой произошла ошибка. Я попытался использовать yylineno в функции yyerror() и записать %option yylineno в файл .l, но после компиляции он выдает ошибку «yylineno undeclared (first use in this function)», и если я инициализирую yylineno как 1, он дает мне эту ошибку:

error: redefinition of yylineno
lex.yy.c:273: note: previous definition of yylineno was here

person user1690394    schedule 22.09.2012    source источник
comment
Было бы полезно, если бы вы предоставили немного больше деталей. yyerror вызывается скелетом бизона; yylineno предоставляется flex (и обычно это макрос). Вы, вероятно, не устроили так, чтобы определение yylineno было видимым в единице компиляции, частью которой является yyerror (особенно легко, если вы используете C++, но достаточно легко и при обычном расположении C). Какие еще варианты гибкости вам нужны? с использованием? (Например, вы запрашивали повторный вход?)   -  person rici    schedule 23.09.2012


Ответы (2)


Есть второй способ попросить flex предоставить глобальную переменную yylineno: переключатель командной строки -l. Если это не работает для вас, вы можете управлять своим собственным глобальным, как Levine et al. предполагает. Увеличьте его в любом правиле, которое соответствует новой строке.

%{
    int mylineno = 1;
%}
%%
* * * 
\n  { mylineno++; }
person David Gorsline    schedule 23.09.2012

Есть несколько способов, которыми вы можете столкнуться с проблемами, но какой из них актуален, трудно догадаться.

  1. У вас есть переменная, определенная в исходном коде Flex (файл .l и объектный файл, созданный из исходного кода), но вы не объявляете ее в грамматике Bison (файл .y) или в заголовке, поэтому она не объявляется при компиляции грамматики. .

  2. У вас это объявлено в грамматике, но вы все еще сталкиваетесь с проблемами. Порядок фрагментов в файле .c, сгенерированном грамматическим или лексическим анализатором, может быть не таким, как вы ожидаете, поэтому в конечном итоге вы ссылаетесь на переменную до того, как она будет объявлена. Код, ссылающийся на него, может появиться в блоке %{ ... %}, он может появиться после второго маркера раздела %%, он может появиться в одном из блоков действий грамматического (или лексического анализатора) или он может появиться в каком-то другом месте в исходном коде. Если каждый из них, который ссылается на переменную yylineno, имеет чистое объявление в блоке (желательно через заголовок), то код должен быть в порядке. Вы пытаетесь устранить дублирование, но, рискуя повториться (что не должно быть большой проблемой, если ваши заголовки идемпотентны), вы можете убедиться, что оно объявлено во всех соответствующих разделах.

Обратите внимание, что по умолчанию грамматика не включает информацию из лексического анализатора; вы должны убедиться, что совместно используемая информация надлежащим образом объявлена ​​и определена.

person Jonathan Leffler    schedule 23.09.2012
comment
Если я инициализировал ошибку yy в файле .l, как мне поделиться ею в файле .y. - person user1690394; 25.09.2012