c - 词法分析器输出问题

标签 c flex-lexer lexical-analysis lexical

这是我输入以下内容时的词法分析器代码:

/*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"); 有什么问题吗?

最佳答案

您的输入中没有任何地方有单独的换行符。您所拥有的只是一个或多个空白字符(空格、制表符和换行符)的序列。由于您有一条与之匹配的规则,因此 Flex 使用最长的匹配。

Flex 生成一个贪婪解析器,它尝试匹配尽可能多的输入。例如,如果它看到输入reality,它在匹配real后不会停止,然后继续将ity匹配为单独的 token 。相反,它符合所有现实

以同样的方式,在开始注释后的输入中,您没有一个而是两个换行符(因为那里有一个空行),并且这将与您的 { 匹配空格}+ 规则,而不是 \n 规则的两次。

关于c - 词法分析器输出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324239/

相关文章:

c++ - 如何继承yyFlexLexer?

c++ - 存储当前被 flex 分析的行

java - C 和 JNI 数组列表

c - 在 C 中将 Int32 类型转换为 sCplx16 IQ 样本

c - 如何从函数返回数组到main

c++ - 使用 lex 和 yacc 打印标记

vim - vim 中的 'word' 是什么?

c - 在函数 ‘yylex’ : 'Variable’ undeclared 中

c - 在随机条件下的无限 while 循环中创建读取器和写入器线程时出现段错误