Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/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
Bison Flex/Flex++;语法错误-";“未被承认的规则”;_Bison_Lex_Flex Lexer_Bisonc++ - Fatal编程技术网

Bison Flex/Flex++;语法错误-";“未被承认的规则”;

Bison Flex/Flex++;语法错误-";“未被承认的规则”;,bison,lex,flex-lexer,bisonc++,Bison,Lex,Flex Lexer,Bisonc++,我正在使用Flex++编写语法来生成解析器,而这段代码总是返回一个“无法识别的规则”错误 这将始终返回以下内容: bisonc++ Compiler.y [Warning] Terminal symbol(s) not used in productions: 257: NUM 261: ENDLINE g++ -c parse.cc flex++ Compiler.l Compiler.l:21: unrecognised rule make: *** [lex.yy.cc] Error 1

我正在使用Flex++编写语法来生成解析器,而这段代码总是返回一个“无法识别的规则”错误

这将始终返回以下内容:

bisonc++ Compiler.y
[Warning] Terminal symbol(s) not used in productions:
257: NUM
261: ENDLINE
g++ -c parse.cc
flex++ Compiler.l
Compiler.l:21: unrecognised rule
make: *** [lex.yy.cc] Error 1
我试着绕过规则,将别名更改为简单的 [a-zA-Z] 甚至只是 [a-z] 这一切都无济于事,我快疯了。。。有人有什么想法吗?
谢谢

此定义无效:

comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]
[
是不同的。
[…]
是一个字符类;也就是说,可能与单个字符匹配的字符列表。
(…)
用于对正则表达式进行分组

另外,我不相信您可以在Flex++正则表达式中插入任意空格字符

所以我认为你的意图是:

comment     ("//".*\n|"/*".*"*/")
在这里,我删除了不正确的方括号,将用于分组的方括号改为括号,并删除了围绕备选方案的不必要分组,因为
的优先级低于串联。我还删除了不必要的反斜杠转义,因为引用足以将
*
转换为性格

但是,这将不能正确地匹配C++注释:

首先,
*
是贪婪的(即,它将匹配最长的字符串),因此

将被错误地识别为单个注释


其次,
与换行符不匹配。因此多行
/*…*/
注释将不匹配,因为
*
不会到达注释的结尾,只会到达行的结尾。

此定义无效:

comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]
[
是不同的。
[…]
是一个字符类;也就是说,可能与单个字符匹配的字符列表。
(…)
用于对正则表达式进行分组

另外,我不相信您可以在Flex++正则表达式中插入任意空格字符

所以我认为你的意图是:

comment     ("//".*\n|"/*".*"*/")
在这里,我删除了不正确的方括号,将用于分组的方括号改为括号,并删除了围绕备选方案的不必要分组,因为
的优先级低于串联。我还删除了不必要的反斜杠转义,因为引用足以将
*
转换为性格

但是,这将不能正确地匹配C++注释:

首先,
*
是贪婪的(即,它将匹配最长的字符串),因此

将被错误地识别为单个注释


其次,
与换行符不匹配。因此多行
/*…*/
注释将不匹配,因为
*
不会到达注释的结尾,只会到达行的结尾。

此定义无效:

comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]
[
是不同的。
[…]
是一个字符类;也就是说,可能与单个字符匹配的字符列表。
(…)
用于对正则表达式进行分组

另外,我不相信您可以在Flex++正则表达式中插入任意空格字符

所以我认为你的意图是:

comment     ("//".*\n|"/*".*"*/")
在这里,我删除了不正确的方括号,将用于分组的方括号改为括号,并删除了围绕备选方案的不必要分组,因为
的优先级低于串联。我还删除了不必要的反斜杠转义,因为引用足以将
*
转换为性格

但是,这将不能正确地匹配C++注释:

首先,
*
是贪婪的(即,它将匹配最长的字符串),因此

将被错误地识别为单个注释


其次,
与换行符不匹配。因此多行
/*…*/
注释将不匹配,因为
*
不会到达注释的结尾,只会到达行的结尾。

此定义无效:

comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]
[
是不同的。
[…]
是一个字符类;也就是说,可能与单个字符匹配的字符列表。
(…)
用于对正则表达式进行分组

另外,我不相信您可以在Flex++正则表达式中插入任意空格字符

所以我认为你的意图是:

comment     ("//".*\n|"/*".*"*/")
在这里,我删除了不正确的方括号,将用于分组的方括号改为括号,并删除了围绕备选方案的不必要分组,因为
的优先级低于串联。我还删除了不必要的反斜杠转义,因为引用足以将
*
转换为性格

但是,这将不能正确地匹配C++注释:

首先,
*
是贪婪的(即,它将匹配最长的字符串),因此

将被错误地识别为单个注释


其次,
与换行符不匹配。因此多行
/*…*/
注释不匹配,因为
*
不会到达注释的结尾,只会到达行的结尾。

我可以建议您不要为单字符特殊字符命名:分号、等号等。只需在注释中使用“;”、“=”等语法和点规则返回
yytext[0].
省去了很多麻烦。奇怪的是,你竟然会回复评论:通常词法分析器只会吃掉它们,它们根本不会出现在语法中。新行同上,除非你的语言是面向行的。大多数都不是。谢谢EJP的建议,我基本上是这样做的,因为我不完全确定发生了什么,我也不知道我害怕打破它…可怜的我知道,我会调查的。谢谢你的帮助!我可以建议你不要为单字符特殊字符命名:分号,等号等。只需在语法中使用“;”,“=”等,并让你的点规则返回
y即可