【发布时间】: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