You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:20:00