我在之前的类(class)中写过 Flex 的东西,但我以前的工作代码都没有解决我遇到的问题。
我在 StackOverflow 上搜索了一个解决方案,但没有一个能解决它。
我有:
- 已检查我在 %{ ... %} 区域没有错误的空格
- 尝试使用#include <'iostream>
- 尝试了 %option noyywrap
这是我的代码(我删除了所有标记等,因为它们有很多):
%{
...
int numLines = 0;
void printTokenInfo(char* tokenType, char* lexeme);
void handleComments(char* text);
%}
WSPACE [ \t\r]+
NEWLINE \n
DIGIT [0-9]
LETTER [a-zA-Z]
IDENT ({LETTER}|_)({LETTER}|{DIGIT}|_)*
INTCONST {DIGIT}+
CHARCONST "'"{LETTER}+"'"
%%
...
%%
// User-written code goes here
void printTokenInfo(char* tokenType, char* lexeme)
{
printf("A");
printf("TOKEN: %s LEXEME: %s\n", tokenType, lexeme);
}
void handleComments(char* text)
{
printf("%s\n", text);
}
int yywrap() { return 1; }
int main()
{
do {
yylex();
} while (!feof(yyin));
return 0;
}
下面是我编译和运行它的方式:
flex FILENAME.l
g++ lex.yy.c -o lexer
lexer < INPUT.txt
导师为我们提供了输入文件,但没有一个有效。它们都因“过早的 EOF”或“坏字符”而失败
有什么想法吗?
最佳答案
好吧,我想我终于找到了答案...尝试使用完整路径运行它,而不仅仅是编译的词法分析器的名称。我通过在 gdb 下运行它发现了“实际”路径(无可否认,这应该是我的第一直觉)。
gdb lexer
(gdb) run < INPUT.txt
最初,我试图运行它:
lexer < INPUT.txt
但是我通过使用 gdb 运行它发现它有效:
/nethome/users/mjc7w6/Classes/lexer < INPUT.txt
编辑:有人在我的 Facebook 上提出进一步改进。如果上述解决方案为您解决了问题,您可能需要使用以下内容编辑 ~/.bashrc:
export PATH=/nethome/users/mjc7w6/Classes:$PATH
或者您发现要设置的路径。
关于c++ - “过早的 EOF”和 'Bad Character' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612189/