Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Flex:尝试生成一个C++;使用Flex的lexer&引用;“未被承认的规则”;错误_C++_Flex Lexer_Lex_Lexer - Fatal编程技术网

C++ Flex:尝试生成一个C++;使用Flex的lexer&引用;“未被承认的规则”;错误

C++ Flex:尝试生成一个C++;使用Flex的lexer&引用;“未被承认的规则”;错误,c++,flex-lexer,lex,lexer,C++,Flex Lexer,Lex,Lexer,我正在尝试使用flex生成lexer。这是我的定义文件lexer.l: %{ #include <iostream> using namespace std; //#define YY_DECL extern "C" int yylex() %} staffType "grand" | "treble" | "bass" | "alto" | "tenor" upperRomans "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" l

我正在尝试使用
flex
生成lexer。这是我的定义文件
lexer.l

%{
#include <iostream>

using namespace std;

//#define YY_DECL extern "C" int yylex()
%}

staffType "grand" | "treble" | "bass" | "alto" | "tenor"
upperRomans "I" | "II" | "III" | "IV" | "V" | "VI" | "VII"
lowerRomans "i" | "ii" | "iii" | "iv" | "v" | "vi" | "vii"
quality "dim" | "halfdim" | "aug" | "maj" | "min"

%%

[ \t\n]+ { ; // Ignore arbitrary whitespace. }
{staffType} { cout << "Staff" << endl; }
{upperRomans} { cout << "Upper roman" << endl; }
{lowerRomans} { cout << "Lower roman" << endl; }
"doublebar" { cout << "End of line" << endl; }
. { cout << "Parse error" << endl; }

%%

int main(int, char**) {
    // lex through the input
    yylex();
}
我得到:

lexer.l:18: unrecognized rule
lexer.l:19: unrecognized rule
lexer.l:20: unrecognized rule
我的flex版本是flex 2.5.35 Apple(flex-31)


我做错了什么?

问题在于模式中不同标记之间的空白。它必须是:

[...]
staffType "grand"|"treble"|"bass"|"alto"|"tenor"
upperRomans "I"|"II"|"III"|"IV"|"V"|"VI"|"VII"
lowerRomans "i"|"ii"|"iii"|"iv"|"v"|"vi"|"vii"
quality "dim"|"halfdim"|"aug"|"maj"|"min"
[...]
它写在报纸上

模式
输入中的模式是使用扩展的 正则表达式集。这些是:

[…]
r | s不是r就是s


第18、19、20行是什么?注意,我不会减少人员类型等。这里:我会将其放入语法中,并在这里识别关键字。请注意,
yylex()
将只扫描一个令牌。您需要循环,直到它返回0或-1,或者它在流末尾执行的任何操作。@EJP谢谢。{upperRomans}。。。是第18行,因为我已经包含了整个源代码。空白空间规则中的C++注释是否可能关闭关闭的Flex括号?尝试删除注释或将其替换为
/***/
-样式的注释。@Angew遗憾的是,删除注释无效。
[...]
staffType "grand"|"treble"|"bass"|"alto"|"tenor"
upperRomans "I"|"II"|"III"|"IV"|"V"|"VI"|"VII"
lowerRomans "i"|"ii"|"iii"|"iv"|"v"|"vi"|"vii"
quality "dim"|"halfdim"|"aug"|"maj"|"min"
[...]