相关疑难解决方法(0)

为什么flex/bison中的多行注释如此回避?

我正在尝试在我的flex(.l)文件中解析C风格的多行注释:

%s ML_COMMENT
%%

...

<INITIAL>"/*"                   BEGIN(ML_COMMENT);
<ML_COMMENT>"*/"                BEGIN(INITIAL);  
<ML_COMMENT>[.\n]+              { }
Run Code Online (Sandbox Code Playgroud)

我没有返回任何令牌,我的语法(.y)也没有以任何方式处理评论.

当我运行我的可执行文件时,我得到一个解析错误:

$ ./a.out
/*
abc 
def
Parse error: parse error
$ echo "/* foo */" | ./a.out
Parse error: parse error
Run Code Online (Sandbox Code Playgroud)

(我的yyerror函数执行printf("解析错误:%s \n"),这是冗余错误消息的前半部分来自).

我可以看到为什么第二个示例失败,因为整个输入是注释,并且由于语法忽略了注释,因此没有语句.因此输入不是有效的程序.但是在我完成评论之前,第一部分抛出了一个解析错误.

同样令人困惑:

$ ./a.out
/* foo */
a = b;
Parse error: parse error
Run Code Online (Sandbox Code Playgroud)

在这种情况下,注释在实际有效输入之前关闭(没有注释,解析就好了).解析"a"后实际发生失败,而不是在尝试解析赋值"a = b;"之后.如果我在自己的行上输入"a",它仍然会抛出错误.

鉴于错误消息是解析器错误而不是扫描程序错误,我的.y文件中是否存在一些至关重要的内容?或者我在扫描器规则中做错了什么传播到解析器端?

编辑: Per @ Rudi的建议,我打开调试,发现:

$ ./a.out
Starting parse
Entering state 0
Reading a token: /*
foo
Next token is 44 (IDENTIFER)
Shifting token 44 (IDENTIFER), Entering …
Run Code Online (Sandbox Code Playgroud)

c comments multiline bison flex-lexer

14
推荐指数
2
解决办法
7400
查看次数

如何在LEX/FLEX中编写非贪婪的匹配?

我正在尝试使用FLEX和BISON解析遗留语言(类似于'C').除了匹配字符串之外,一切都很好用.

这种相当奇怪的遗留语言不支持在字符串文字中引用字符,因此以下都是有效的字符串文字:

"hello"
""
"\"
Run Code Online (Sandbox Code Playgroud)

我正在使用以下规则来匹配字符串文字:

\".*\"            { yylval.strval = _strdup( yytext ); return LIT_STRING; }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是一个贪婪的匹配,所以它匹配如下代码:

"hello", "world"
Run Code Online (Sandbox Code Playgroud)

作为单个字符串(hello", "world).

通常的非贪婪量词.*?似乎在FLEX中不起作用.有任何想法吗?

regex lex flex-lexer

12
推荐指数
1
解决办法
3908
查看次数

标签 统计

flex-lexer ×2

bison ×1

c ×1

comments ×1

lex ×1

multiline ×1

regex ×1