Flex程序未按预期匹配输入且重复输出问题求助
问题原因及修复方案
核心问题分析
你的Flex代码存在4个关键错误,直接导致规则不触发、输出异常:
- 规则定义冗余双引号:所有用双引号包裹的规则(如
"TRUE"|"FALSE")会匹配带双引号的字符串,而非目标单词本身。比如stala_logiczna规则只会识别"TRUE",而非TRUE。 - 标识符规则范围过窄:
identyfikator定义为[a-z]+,仅匹配全小写字母组合,但你输入的Wlazl、Zlazl是大写开头,完全不符合该规则,自然不会触发对应输出。 - 换行符规则语法错误:
nowa_linia直接写入换行符而非转义序列\n/\r,导致Flex解析规则时出错,该规则无法正常工作。 - 输出字符串转义错误:所有
printf中的换行直接用了换行而非\n转义字符,导致编译后程序输出混乱,出现类似重复内容的异常。
修复后的代码
%option noyywrap %{ #include <stdlib.h> #include <stdio.h> #include <string.h> /*#include "TJF.tab.h"*/ char czy_poprawny = 1; %} identyfikator [a-zA-Z]+ // 支持大小写开头的标识符 stala_logiczna TRUE|FALSE operator_relacyjny <|<=|==|>=|>|<> i_lub AND|OR nie NOT nawias_otw \( nawias_zam \) zakoncz \. spacja [ \t]+ nowa_linia \n|\r nieprawidlowy_znak . %% identyfikator {printf("Znaleziono identyfikator - %s\n", yytext);} stala_logiczna {printf("Znaleziono stala logiczna - %s\n", yytext);} operator_relacyjny {printf("Znaleziono operator relacyjny - %s\n", yytext);} i_lub {printf("Znaleziono i/lub - %s\n", yytext);} nie {printf("Znaleziono nie - %s\n", yytext);} nawias_otw {printf("Znaleziono nawias otwierajacy\n");} nawias_zam {printf("Znaleziono nawias zamykajacy\n");} zakoncz {printf("Znaleziono kropke\n");} spacja {printf("Znaleziono spacje\n");} nowa_linia {printf("Znaleziono znak nowej linii\n");} nieprawidlowy_znak {czy_poprawny = 0; printf("Znaleziono nieprawidlowy znak - %s\n", yytext);} %% int main(){ yylex(); if (czy_poprawny == 1){ printf("OK!\n"); } else{ printf("ERROR!\n"); } return 0; }
修复说明
- 移除所有规则中的冗余双引号,让规则匹配目标单词本身。
- 扩展
identyfikator规则为[a-zA-Z]+,支持大小写字母组成的标识符。 - 将换行符规则改为
\n|\r,使用正确的正则转义序列。 - 把所有
printf中的直接换行替换为\n转义字符,确保输出格式规范。 - 对正则特殊字符(
(、)、.)添加转义符\,避免被Flex当作语法解析。
测试验证
编译运行修复后的代码:
- 输入
Wlazl会触发identyfikator规则,输出Znaleziono identyfikator - Wlazl; - 输入
TRUE会触发stala_logiczna规则,输出对应提示; - 不会再出现输入内容重复输出的异常。
内容的提问来源于stack exchange,提问作者Firana M
相关产品推荐
相关产品推荐

