【问题标题】:Is it possible to define multiple 'names' in Flex/Lex?是否可以在 Flex/Lex 中定义多个“名称”?
【发布时间】:2018-12-17 23:19:57
【问题描述】:

我正在尝试使用参数-lfl 在以下文件上运行flex。 我收到以下错误:

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 %

前面的数字只是行号(从启用 :setnumber 标志的 vim 复制)。

我假设错误与“return ARABIC_NUMERAL”行有关,但我在哪里没有看到这明显违反了 lex 的规则?真诚地在这里挠头,并希望有任何正确方向的指示。

【问题讨论】:

  • 原来是每行中的那些 cmets ......应该早点找到那个
  • 第 24 行缺少一个分号。就我个人而言,我不会将 cmets 放在分号之前,但这就是我。第 22 行设置 yyval 而不是 yylval
  • 我不确定科普特人是否喜欢与“copped”混淆:D

标签: c compiler-construction bison flex-lexer lex


【解决方案1】:

使用这个——在匹配规则之前和之后使用%%,而不是%等。

%{
// 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 之后)和一个缺失的l(在yylval 中为V),并更改了第二个@987654331 @ 到 50(以及“四十”的拼写)。我添加了 XCX 规则——你似乎忽略了 90 和 10。

我还使对齐方式和 cmets 更加对称;一致性在编程中非常重要。

第二个%% 是可选的;第一个不是。

您在链接时向编译器提供-lfl 选项;转换源时不要将其提供给flex。这就是为什么您收到关于找不到 -lfl 的错误。

【讨论】:

  • 是的,是的,cmets 没有任何影响,但错误“名称定义不止一次”已经消失,我认为我已修复它。 %% 是一个菜鸟错误.. 和 studio.h 和缺少的字母一样:
猜你喜欢
  • 2017-02-13
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2023-02-04
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多