FLEX将单词替换为日期



我对flex真的很陌生,遗憾的是,与其他语言相比,互联网上的例子很少。我想替换单词:

  1. 今天与今天的日期
  2. 明天与明天日期1
  3. 昨天与昨天日期
  4. TODAY-n,今天日期在n天之前
  5. TODAY+n,n天后的今天日期

我做了一些研究,唯一发现的是用字符串中的另一个单词替换一个单词。这是完全不同的。

只是我取得了一些进展:

TODAY "TODAY"
YESTERDAY "YESTERDAY"
TOMORROW "TOMORROW"
TODAY+n "TODAY+n"
TODAY-n "TODAY-n"
%%
{TODAY} {op=1;}
{YESTERDAY} {op=2;}
{TOMORROW} {op=3;}
{TODAY+n} {op=4;}
{TODAY-n} {op=5;}
%%
date()
{
if (op==0)

a=(yytext);

switch(op)
{
case 1:TODAY;
break;

case 2:YESTERDAY;
break;

case 3:TOMORROW;
break;

case 4;TODAY+n;
break;

case 5;TODAY-n;
break;
}
op=0;
}

这里有一个非常基本的实现,专注于flex,而不是复杂的计算和显示日期。这取决于未识别字符的默认操作是将它们复制到输出流。然而,为了避免在单词中间识别TODAY(如AATODAYBB(,我添加了一个匹配任何仅由字母字符组成的单词的模式,并显式地将其复制到输出流中(使用ECHO(。根据您的实际需要,您可能需要进行调整。

快速阅读flex手册应足以理解该程序。特别是,看看介绍性材料,包括简单的例子;模式的描述(与标准正则表达式相似但不完全相同,但缺少许多昂贵的功能,如捕获(;以及对扫描输入的方式的描述。最后一节还解释了所谓的";最大咀嚼量";(第一个最长匹配(算法,该算法在最后一条规则(必须是最后一条(中使用。

%option noinput nounput noyywrap
%{
#include <stdio.h>
#include <string.h>
/* Replace this with a function which actually shows the correct date */
void show_date(int offset) {
if (offset > 0)
fprintf(yyout, "<today's date + %d>", offset);
else
fprintf(yyout, "<today's date %.0d>", offset);
}
%}
%%
TODAY           { show_date(0); }
TOMORROW        { show_date(1); }
YESTERDAY       { show_date(-1); }
TODAY[+-][0-9]+ { show_date(atoi(yytext + 5)); /* +5 to skip TODAY */ }
[[:alpha:]]+    { ECHO; /* Avoid false matches. See text. */ }

编译和运行:

# (Assuming the above file is called date_subst.l)
flex -o date_subst.c date_subst.l
gcc -Wall -g -o date_subst date_subst.c -lfl
./date_subst

最新更新