Когда я скомпилировал копию вашего кода в MacOS X (10.7.2) с flex
(2.5.35) и gcc
(4.6.1), единственные жалобы, которые я получил от компилятора C, касалисьнепрототипное определение main()
, и это потому, что я всегда компилирую с включенным предупреждением и упоминанием yyunput() defined but not used
(это не ваша ошибка).
Поскольку вы изучаете C, вам следует толькоиспользуя нотацию:
int main(int argc, char **argv)
{
...
}
или эквивалентную.
Я также преобразовал файл miniStarLogo.l
в формат DOS (окончания строк CRLF), и оба flex
и gcc
казалось, что все в порядке с результатами - к моему удивлению.Это может быть не так на вашей машине.
Когда я запустил код на ваших тестовых данных, я получил:
Keyword: fd
Illegal: 3x00
0
Keyword: bk
setc 100
Keyword: int
ID: xy3
Keyword: fd
10 rt 90
Итак, вы не далеко, где вам нужно бытьпо моим расчетам.
В моих командах царит путаница.
Я использовал (хммм, это был GCC 4.2.1, а не 4.6.1), но:
$ flex miniStarLogo.l
$ gcc -Wall -Wextra -O3 -g -o lex.yy lex.yy.c -lfl
miniStarLogo.l:22: warning: return type defaults to ‘int’
miniStarLogo.l: In function ‘main’:
miniStarLogo.l:42: warning: control reaches end of non-void function
miniStarLogo.l: At top level:
lex.yy.c:1114: warning: ‘yyunput’ defined but not used
$ ./lex.yy <<EOF
> fd 3x00
> bk
> setc 100
> int xy3 fd 10 rt 90
> EOF
Keyword: fd
Illegal: 3x00
0
Keyword: bk
setc 100
Keyword: int
ID: xy3
Keyword: fd
10 rt 90
$
(ОК - я немного обманул: в первый раз я запустил rmk lex.yy LDLIBS=-lfl
, где rmk
- вариант make
, а правила компиляции в каталоге используют показанную командную строку. Но я переделалкомпиляции для получения правильных сообщений об ошибках, точно так же, как указано выше.)
Возможно, вам придется взглянуть на расширение ваших шаблонов, чтобы принимать «одну или несколько» цифр с [0-9]+
вместо просто [0-9]
.Возможно, вам придется взглянуть на правило, касающееся непревзойденных символов.И лично я прилагаю большие усилия, чтобы избежать пропусков непосредственно перед новыми строками, поэтому вам нужно будет ужесточить форматирование печати в соответствии с моими критериями.Однако запуск программы не имеет смысла.
Кроме того, если вам нужно преобразовать файл из DOS в конец строки Unix, проще всего будет команда dos2unix
, если она у вас есть на вашем компьютере.В противном случае используйте:
$ tr -d '\015' < miniStarLogo.l > x
$ od -c x
0000000 % { \r \n \r \n / * C o m m e n t
...
0001560 \n } \r \n
0001564
$ mv x miniStarLogo.l
$
Я осторожно добавил возврат каретки, используя vim
и :set fileformat=dos
;было бы также возможно отменить это с vim
и :set fileformat=unix
.Это Unix, так что TMTOWTDI (есть больше, чем один способ сделать это - девиз Perl), и я даже не пытаюсь использовать Perl.