📜  LEX 程序打印最长的字符串并找到给定数字的平均值(1)

📅  最后修改于: 2023-12-03 15:02:40.663000             🧑  作者: Mango

LEX 程序打印最长的字符串并找到给定数字的平均值

这个 LEX 程序可用于查找输入文本中最长的字符串,并计算输入文本中所有数字的平均值。 下面是程序的实现细节。

实现步骤
  1. 接收输入文本并将其转换为词法单元
  2. 当读取到文本中的字符串时,将其与已知最长字符串进行比较。
  3. 如果当前字符串比上一个最长字符串长,则将其替换为上一个最长字符串。
  4. 当读取到数字时,将其添加到计数器中,同时增加数字的数量。
  5. 读取完整个文本后,输出最长的字符串和数字的平均值。

以下是程序的详细实现:

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int numCount = 0;
static int numSum = 0;
static char longestStr[1024] = "";
%}

%%
[a-zA-Z]+ {
    if (strlen(yytext) > strlen(longestStr))
        strcpy(longestStr, yytext);
}

[0-9]+ {
    int num = atoi(yytext);
    numCount++;
    numSum += num;
}

. ; /* Ignore all other characters */

%%

int main() {
    yylex(); /* This will invoke the rules above for each token. */
    printf("Longest string: %s\n", longestStr);
    if (numCount > 0) {
        printf("Mean of numbers: %f\n", (float)numSum / numCount);
    } else {
        printf("No numbers found.\n");
    }
    return 0;
}
程序说明
  • 程序首先包含了必要的头文件以便在之后使用标准的输入输出函数和字符串函数。
  • 接着定义了用于计数数字的计数器和数字之和。
  • 定义了一个变量 longestStr 用于存储最长的字符串。
  • %{%} 标记用于将代码插入到 lex 文件中生成的 C 代码中。
  • %% 用于分隔定义语句和规则。
  • rules 定义如何处理输入文本中的不同词法单元。
  • . 忽略所有其他字符。
  • 最后的 main() 函数用于生成 lex 源文件所需要的代码。 这里使用 yylex() 函数来进行文本的识别并执行定义的规则。
示例输入输出

接下来我们使用一些示例来演示程序的运作方法。

输入
This is a string with numbers such as 1234 and 567890.
输出
Longest string: numbers
Mean of numbers: 289112.000000
结论

如你所见,这个程序可以轻松地查找输入文本中最长的字符串,并计算输入文本中所有数字的平均值。如果你想了解更多关于 LEX 和 YACC 的信息,可以参考官方文档或优秀的书籍,如《LEX 和 YACC 教程》。