Можно ли определить несколько «имен» во Flex / Lex? - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь запустить flex в следующем файле с аргументами -lfl.Я получаю следующие ошибки:

romans.l:14: name defined twice
romans.l:16: name defined twice
romans.l:17: name defined twice
romans.l:19: name defined twice
romans.l:22: name defined twice
romans.l:23: name defined twice
romans.l:24: bad character: \
romans.l:24: unknown error processing section 1
romans.l:24: unknown error processing section 1
romans.l:24: bad character: {
romans.l:24: unknown error processing section 1
romans.l:24: unknown error processing section 1
romans.l:24: bad character: }
romans.l:25: unrecognised '%' directive
flex: can't open -lfl 

Давайте пока проигнорируем другие ошибки в моем коде, так как я не понимаю, почему существует проблема со строками с 14 по 23. В лучшую сторонумои знания, не должно быть проблем с тем, что я пытаюсь сделать.Вот мой файл lex.

  1  %{
  2 // file created via echo
  3 # include <studio.h>
  4 # include "roman.tab.h"
  5 %}
  6 I{4}    { yyerror("syntax error");}
  7 V{4}    { yyerror("syntax error");}
  8 X{4}    { yyerror("syntax error");}
  9 C{4}    { yyerror("syntax error");}
 10 L{4}    { yyerror("syntax error");}
 11 D{4}    { yyerror("syntax error");}
 12 M{4}    { yyerror("syntax error");}
 13 CM      { yylval = 900; return ARABIC_NUMERAL /* NINEHUNDRED */;}
 14 M       { yylval = 1000; return ARABIC_NUMERAL /* THOUSAND */ ; }
 15 CD      { yylval = 400; return ARABIC_NUMERAL /*return FOURHUNDRED*/;}
 16 D       { yylval = 500; return ARABIC_NUMERAL /*return FIVEHUNDRED*/;}
 17 C       { yylval = 100; return ARABIC_NUMERAL /*return HUNDRED*/;}
 18 XL      { yylval = 40; return ARABIC_NUMERAL /*return FOURTY*/;}
 19 L       { yylval = 40; return ARABIC_NUMERAL /*return FIFTY*/;}
 20 IX      { yylval = 9; return ARABIC_NUMERAL /*return NINE*/; }
 21 IV      { yylval = 4; return ARABIC_NUMERAL /*return FOUR*/; }
 22 V       { yyval = 5; return ARABIC_NUMERAL /*return FIVE*/; }
 23 I       { yylval = 1; return ARABIC_NUMERAL /*return ONE*/; }
 24 \n      { return EOL }
 25 %

Числа спереди - это просто номера строк (скопированные из vim с: флаг setnumber включен).

Я предполагаю, что ошибка имеет какое-то отношениесо строкой «return ARABIC_NUMERAL», но где я видел, что это явно противоречит правилам lex?Я искренне почесываю голову и буду признателен за любые указатели в правильном направлении.

1 Ответ

0 голосов
/ 18 декабря 2018

Используйте это - используя %% до и после соответствующих правил вместо % и т. Д.

%{
// file created via echo
#include <stdio.h>
#include "roman.tab.h"
%}
%%
I{4}    { yyerror("syntax error");}
V{4}    { yyerror("syntax error");}
X{4}    { yyerror("syntax error");}
C{4}    { yyerror("syntax error");}
L{4}    { yyerror("syntax error");}
D{4}    { yyerror("syntax error");}
M{4}    { yyerror("syntax error");}
M       { yylval = 1000; return ARABIC_NUMERAL /* THOUSAND */; }
CM      { yylval =  900; return ARABIC_NUMERAL /* NINEHUNDRED */; }
D       { yylval =  500; return ARABIC_NUMERAL /* FIVEHUNDRED */; }
CD      { yylval =  400; return ARABIC_NUMERAL /* FOURHUNDRED */; }
C       { yylval =  100; return ARABIC_NUMERAL /* HUNDRED */; }
XC      { yylval =   90; return ARABIC_NUMERAL /* NINETY */; }
L       { yylval =   50; return ARABIC_NUMERAL /* FIFTY */; }
XL      { yylval =   40; return ARABIC_NUMERAL /* FORTY */; }
X       { yylval =   10; return ARABIC_NUMERAL /* TEN */; }
IX      { yylval =    9; return ARABIC_NUMERAL /* NINE */; }
V       { yylval =    5; return ARABIC_NUMERAL /* FIVE */; }
IV      { yylval =    4; return ARABIC_NUMERAL /* FOUR */; }
I       { yylval =    1; return ARABIC_NUMERAL /* ONE */; }
\n      { return EOL; }
%%

Я «исправил» studio.h до stdio.h, вставил пропущенный ; (после EOL) и пропущенный lyylval для V), а второй 40 изменился на 50 (и написание «сорок»).Я добавил правила XC и X - кажется, вы пропустили 90 и 10.

Я также сделал выравнивание и комментарии более симметричными;согласованность очень важна в программировании.

Второй %% является необязательным;первое - нет.

Вы предоставляете опцию -lfl компилятору при компоновке;вы не предоставляете его flex при преобразовании источника.Вот почему вы получили сообщение о том, что -lfl не найдено.

...