是否可以在Flex/Lex中定义多个'names'?
Is it possible to define multiple 'names' in Flex/Lex?
我正尝试 运行 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 规则?在这里真诚地挠我的头,并感谢任何指向正确方向的指示。
使用这个——在匹配规则前后使用 %%
而不是 %
等
%{
// 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; }
%%
I 'fixed' studio.h
到 stdio.h
,插入了一个缺失的 ;
(在 EOL
之后)和一个缺失的 l
(在 yylval
为 V
),并将第二个 40
更改为 50
(以及 'forty' 的拼写)。我添加了 XC
和 X
规则 — 你似乎忽略了 90 和 10。
我还让对齐和注释更加对称;一致性在编程中非常重要。
第二个%%
是可选的;第一个不是。
您在链接时向编译器提供 -lfl
选项;转换源代码时,您没有将其提供给 flex
。这就是为什么您收到有关 -lfl
未找到的错误。
我正尝试 运行 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 规则?在这里真诚地挠我的头,并感谢任何指向正确方向的指示。
使用这个——在匹配规则前后使用 %%
而不是 %
等
%{
// 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; }
%%
I 'fixed' studio.h
到 stdio.h
,插入了一个缺失的 ;
(在 EOL
之后)和一个缺失的 l
(在 yylval
为 V
),并将第二个 40
更改为 50
(以及 'forty' 的拼写)。我添加了 XC
和 X
规则 — 你似乎忽略了 90 和 10。
我还让对齐和注释更加对称;一致性在编程中非常重要。
第二个%%
是可选的;第一个不是。
您在链接时向编译器提供 -lfl
选项;转换源代码时,您没有将其提供给 flex
。这就是为什么您收到有关 -lfl
未找到的错误。