当我输入以下内容时,这是我的词法分析器代码:
/*This is an example */
program
var a,b:integer;
begin
a =2;
b =a+5;
write(a);
if b==1 then write(a);
end
输出必须如下:
<res,program>
<res,var> <id,a>,<id,b>:<res,integer>;
<res,begin>
<id,a> <assign,=><num,2>;
<id,b> <assign,=><id,a><addop,+><num,5>;
<res,write>(<id,a>);
<res,if> <id,b><relop,==><num,1> <res,then> <res,write>(<id,a>);
<res,end>
但我的输出是:
Lexical Error~/hedor1>exampler < input\ .txt
<res,program><res,var><id,a>,<id,b>:<res,integer>;<res,begin><id,a><assign,=><num,2>;<id,b><assign,=><id,a><addop,+><num,5>;<res,write>(<id,a>);<res,if><id,b><relop,==><num,1><res,then><res,write>(<id,a>);<res,end>
我不知道为什么它只是避免换行并且不会将它打印到输出中,尽管我已经在我的模式部分\n printf("\n");
中定义了它
有什么问题?
答案 0 :(得分:0)
您输入的任何地方都没有单独的换行符。你所拥有的只是一个或多个空白字符(空格,制表符和换行符)的序列。由于您的规则与之匹配,因此Flex使用最长匹配。
Flex生成一个贪婪的解析器,它尝试匹配尽可能多的输入。例如,如果它看到输入真实,则在匹配真实之后不会停止,然后继续匹配 ity 作为单独的令牌。相反,它匹配所有现实。
同样地,在开始评论之后的输入中,你只有两个换行符(因为那里有一个空行),这将与你的 {匹配空格} + 规则,而不是 \ n 规则的两倍。