我对 Lex 非常陌生,这个问题的完整要求如下:
编写一个 Lex 输入文件,该文件将生成一个计算文本文件中的字符、单词和行数并报告计数的程序。将单词定义为任何字母和/或数字序列,没有标点符号或空格。标点符号和空格不算作单词。
现在我写下了代码:
%{
#include <stdio.h>
#include <stdlib.h>
int cno = 0, wno = 0, lno = 0; /*counts of characters, words and lines */
%}
character [a-z]
digit [0-9]
word ({character}|{digit})+[^({character}|{digit})]
line \n
%%
{line} { lno++; REJECT; }
{word} { wno++; REJECT; }
{character} { cno++; }
%%
void main()
{ yylex();
fprintf(stderr, "Number of characters: %d; Number of words: %d; Number of lines: %d\n", cno, wno, lno);
return;
}
我用文本文件对其进行了测试:
this is line #1
line #2 is here
!@#$%^&*()
haha hey hey
我得到了输出
#1
#2
!@#$%^&*()
Number of characters: 30; Number of words: 45; Number of lines: 4
但正确的输出应该是
Number of characters: 30; Number of words: 11; Number of lines: 4
我猜“字数”的错误应该是由于每个字符数,所以我应该如何修改我的程序来解决这个问题?
此外,还会出现一些不必要的输出(那些标点符号)。我应该如何修改我的程序以避免它们?
非常感谢。