导航:首页 > 净水问答 > lex过滤空格

lex过滤空格

发布时间:2021-03-08 04:11:07

⑴ 词法扫描器 c c++

类似的词法分析器,你可以在这基础上加上一些功能。mlex.c内容如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>#include <assert.h>#include "lex.h"
char strToken[30]; //字符数组,存放构成单词符号的字符串。int lvalue; //单词的内码值keyword keywords[]={ "switch",$SWITCH, "case",$CASE, "if",$IF, "else",$ELSE, "do",$DO, "while",$WHILE, "stop",$STOP, "end",$END, "var",$VAR, "dim",$DIM, "char",$CHAR, 0,0,}; //关键字表symbol ctable[200]; //常数表symbol vtable[200]; //符号表(标识符)char inbuf[300]; //扫描缓冲区int sp; //起点指示器int ep; //扫描指示器int lineno; //行计数器FILE *fsrc;
char GetChar(){ //从扫描缓冲区第一个缓冲区从inbuf中读一个字符,实现双输入缓冲。 //[0]到inbuf[149],第二个缓冲区从inbuf[150]到inbuf[299], //每次从源文件读一个缓冲区大小的内容,分析完当前工作缓冲区内容时把源文件读入 //另一个缓冲区,另一个缓冲区成为工作缓冲区 int i = 0; char ch; if ((ep == 150)||(ep == 300)) { ep = ep%300; while (((inbuf[i+ep]=fgetc(fsrc))!=NULL) && (i<150)) i++; } ch = inbuf[ep]; ep++; return ch;}char GetBC(){ //从扫描缓冲区读字符,过滤空格、制表和回车符号 char ch = GetChar(); while ((ch==' ') || (ch=='\n') || (ch=='\t')) { if (ch=='\n') lineno++; ch = GetChar(); } return ch;}void Concat(char str[], char ch){ //将字符ch添加到符号串str的尾部 str[strlen(str)] = ch;}bool isLetter(char ch){ //判断ch是否字母 if (((ch>='A')&&(ch<='Z')) || ((ch>='a')&&(ch<='z'))) return true; return false;}bool isDigit(char ch){ //判断ch是否数字 if ((ch>='0')&&(ch<='9')) return true; return false;}
int Reserve(char* str){ //如str是保留字,返回保留字种别号 //否则返回0 int i = 0; while (keywords[i].code != 0) { if (strcmp(str,keywords[i].name) == 0) return keywords[i].code; i++; } return 0;}void Retract(){ //从扫描输入缓冲区回退一个字符 if (ep==0) ep = 299; else ep--;}
int InsertID(char *str){ //如符号表中已有str标识符,返回记录号, //否则将str加到符号表中,返回记录号 int i = 0; while ((vtable[i].number!=0) && (i<200)) { if (strcmp(str,vtable[i].name) == 0) return vtable[i].number; i++; } if (i<200) { vtable[i].number = i+1; strcpy(vtable[i].name, str); return vtable[i].number; } return 0;}int InsertConst(char *str){ //如常数表中已有str常数,返回记录号, //否则将str加到常数表中,返回记录号 int i = 0; while ((ctable[i].number!=0) && (i<200)) { if (strcmp(str,ctable[i].name) == 0) return ctable[i].number; i++; } if (i<200) { ctable[i].number = i+1; strcpy(ctable[i].name, str); return ctable[i].number; } return 0;}void ProcError(){ printf("%i 行有错误\n", lineno);}int Lex(){ //从扫描缓冲区中识别出一个单词,返回单词种别号, //构成的单词的符号串保留在strToken中, //单词的值保留在lvalue中。strToken和lvalue为全局变量。 int code; char ch;
memset(strToken, 0, 30); ch = GetBC(); sp = ep-1; lvalue = 0; if (isLetter(ch)) { while (isLetter(ch) || isDigit(ch)) { Concat(strToken, ch); ch = GetChar(); } Retract(); code = Reserve(strToken); if (code == 0) { lvalue = InsertID(strToken); return $ID; } return code; } else if (isDigit(ch)) { while (isDigit(ch)) { Concat(strToken, ch);ch = GetChar(); } if (ch == '.' ) { Concat(strToken, ch); if(!isDigit(GetChar())) {ProcError(); return $END;} Retract(); while(isDigit(GetChar())) { Retract(); Concat(strToken,GetChar()); Retract(); GetChar(); } InsertConst(strToken); return $FLOAT; } Retract(); lvalue = InsertConst(strToken); return $INT; }

else if (ch == '=') { ch = GetChar(); if (ch == '=') return $EQ; Retract(); return $ASSIGN; } else if (ch == '+') return $PLUS; else if (ch == ';') return $SEMICOLON; else if (ch == '(') return $LPAR; else if (ch == ')') return $RPAR; else if (ch == '{') return $LBRACE; else if (ch == '}') return $RBRACE;
else if (ch == '*') { ch = GetChar(); if (ch == '*') return $POWER; Retract(); return $STAR; } else if (ch == EOF) return $END; else { ProcError(); return $END; }}void main(){ token aToken; int i = 0; char strName[256]; FILE *fcon = fopen("const.txt","w+"); FILE *ftoken = fopen("token.txt","w+"); FILE *fsym = fopen("symbol.txt","w+"); printf("请输入源文件名(enter结束):\n"); scanf("%s",strName); fsrc = fopen(strName,"r"); if (fsrc == NULL) { printf("找不到源文件src.txt\n"); exit(1); } if ((ftoken == NULL) || (fcon == NULL) || \ (fsym == NULL)) { printf("不能创建输出文件const.txt,token.txt,symbol.txt\n"); exit(1); } /*读源文件入缓冲区*/ while ((i<150) && ((inbuf[i]=fgetc(fsrc)) != EOF)) i++;
/*词法分析开始*/ ep = 0; lineno = 1; aToken.label = 0; aToken.code = Lex(); aToken.addr = lvalue; printf("单词序列:\n"); while (aToken.code != $END) { //单词输出到文件 fprintf(ftoken, "(%3d,%3d)", aToken.code, aToken.addr); //单词输出到屏幕 printf("(%3d,%3d) ", aToken.code, aToken.addr); aToken.label++; aToken.code = Lex(); aToken.addr = lvalue; } /*词法分析结束,输出符号表和常数表到symbol.txt、const.txt文件并显示在屏幕*/ i = 0; printf("\n符号表:\n"); while (vtable[i].number != 0) { fprintf(fsym, "(%3d,%s)", vtable[i].number, vtable[i].name); printf("(%3d,%s)", vtable[i].number, vtable[i].name); i++; } i = 0; printf("\n常数表:\n"); while (ctable[i].number != 0) { fprintf(fcon, "(%3d,%s)", ctable[i].number, ctable[i].name); printf("(%3d,%s)", ctable[i].number, ctable[i].name); i++; } fclose(fsrc); fclose(fsym); fclose(fcon); fclose(ftoken); printf("\n词法分析结束,按任意键\n"); getch();}

lex.h头文件内容如下:typedef struct token{ int label; char name[30];//组成单词的字符串 int code; int addr;}token;
typedef struct symbol{ int number; char name[30];//组成标识符或常数的字符串} symbol;
typedef struct keyword{ char name[30]; //组成关键字的字符串 int code;} keyword;
//定义一些常量enum TVAL {$WHILE=1,$IF,$ELSE,$SWITCH,$CASE,$DO,$STOP,$END,$ID,$INT,$EQ,$ASSIGN,$PLUS, \ $STAR,$POWER,$COMMA,$LPAR,$RPAR,$SEMICOLON,$LBRACE, \ $RBRACE,$VAR,$DIM,$FLOAT,$CHAR};

⑵ lex 中带空格的单词的 正则表达式

实际上这是没有意义的操作,因为既然是单词中间怎么还要有空格呢。单词以空格分隔这是毋庸置疑的,不能像你那样操作

⑶ 用正则式描述C语言的各种词型,借助LEX工具实现C语言的词法分析器。 请详细回答相关思考题: 越详细越好。

1.输入是代码来文件,输出是一个个的自token。这些输出之后是供语法分析器(yacc,bison什么的)用的。
2.做准备的话你可以看看《c专家编程》第3章:分析c语言的声明。这个例子是一个最简单的词法+语法分析器,足够给你一些提示了。当然这还不够,你可能要找一份C语言的标准来看。
3.归类无非是修饰符、类型、关键字、标识符、运算符等等了。
4.在2的基础上。不难解决。
5.这个很简单。就算直接文件处理也解决掉了。依稀记得lex可能更容易做这件事儿。
总体来说,这事儿如果自己做可能比较费劲,用lex应该省事不少。
=========================================================================
上面只是凭印象说的,希望对你有帮助。等等看有没有大牛帮你完成吧。或者等我有空咱们一起研究下。

⑷ Lex与yacc的具体使用

第一个问题,应该是重定义 YY_INPUT
#define YY_INPUT(buf,result,max_size) {\
result = GetNextChar(buf, max_size); \
if ( result <= 0 ) \
result = YY_NULL; \
}

在 GetNextChar里面设置buf。 你的analyse调用yylex 或者yyparse。

我也是初学,版回答错了,不要怪我。权

⑸ linux 里文件名的空格怎么表示

有空格的文件吗 这样吧还是做个example吧 比如建立一个名为“ivan lex”的空文件就是 touch "ivan lex" 这样就可以了,只要加引号即可

⑹ lex怎么在哔哩哔哩搜不到了

LexBurner
蕾丝全名,我这里都可以搜到,你再试试 会不会多打了空格什么之类的

⑺ 如何用LEX 来读取一个文件,把其中的非空白符替换成空格,并把替换后的保存到新的文件中。

首先给出源文件:print.lex
%{
#include <stdio.h>
#include<stdlib.h>
%}
%%
[ ]+ fprintf(yyout," ");
\n fprintf(yyout," ");
[\t]+ fprintf(yyout," ");
%%

int yywrap(void)
{
return 1;
}

main()
{
char filename[50];
printf("Input the name of the data file:");
scanf("%s",filename);
yyin = fopen(filename, "r");
yyout=fopen("p.txt","w");
yylex();

}
第二步:用flex编译后,生成lex.yy.c文件(可以直接拖动到flex.exe打开)
第三步:用vc编译并运行lex.yy.c生成lex.yy.exe
第四步:输入编译目录下的一个文件名,即可得到p.txt
例:a.txt
asdfas
dfasdf sdfsdf dfsdfsdf
dfsdfasdf b c d e f g h i j k
最后可得p.txt:asdfas dfasdf sdfsdf dfsdfsdf dfsdfasdf b c d e f g h i j k
你有flex.exe吗?没有的话,给我邮箱我给你发过去 。

⑻ LEX的描述过滤C代码中注释符/**/的语句是什么

Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次 完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度 和安全。下面给大家介绍一下Boa服务器移植的具体操作步骤,希望能够有帮助。环境主机:ubuntu8.10交叉工具链:gcc-3.4.5-glibc-2.3.6目标:s3c2410开发板结合网上一些文档,整理了一个比较完整的文档。1.下载Boa源码下载地址: 最新发行版本: 0.94.13下载 boa-0.94.13.tar.gz解压:# tar xzf boa-0.94.13.tar.gz2.安装需要工具bison,flexsudo apt-get install bison flex否则会出现如下错误make: yacc:命令未找到make: *** [y.tab.c] 错误 127make: lex:命令未找到make: *** [lex.yy.c] 错误 1273.修改文件(1)修改 src/compat.h找到#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff修改成#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff否则会出现错误:util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o] 错误 1(2)修改 src/log.c注释掉if (p2(error_log, STDERR_FILENO) == -1) 为:/*if (p2(error_log, STDERR_FILENO) == -1) */否则会出现错误:log.c:73 unable to p2 the error log:bad file deor(3)修改src/boa.c注释掉下面两句话:if (passwdbuf == NULL) if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) 为#if 0if (passwdbuf == NULL) if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) #endif否则会出现错误:boa.c:211 - getpwuid: No such file or directory注释掉下面语句:if (setuid(0) != -1) 为#if 0if (setuid(0) != -1) #endif否则会出现问题:boa.c:228 - icky Linux kernel bug!: No such file or directory4、生成Makefile文件执行:#cd boa-0.94.13/src#./configure5、修改Makefilecd srcvim Makefile修改CC = gcc 为 CC = arm-softfloat-linux-gnu-gcc修改CPP = gcc -E 为 CC = arm-softfloat-linux-gnu-gcc -E6、编译makels -l boa-rwxr-xr-x 1 david david 189223 2009-05-31 13:44 boa然后为生成的二进制文件boa瘦身arm-softfloat-linux-gnu-strip boals -l boa-rwxr-xr-x 1 david david 61052 2009-05-31 13:51 boa可以发现boa的大小前后差距很大这为我们节省了很大的空

⑼ linux 文件名可以有空格吗,如何在命令行中建立有空格的文件,是不需要一个什么转义字符阿

有空格的文件吗
这样吧还是做个example吧
比如建立一个名为“ivan lex”的空文件就是
touch "ivan lex" 这样就可以了,只要加引号即可

⑽ oracle 全文索引,chinese_vgram_lexer 分析器,不能检索类似电话号码,身份证号码,这样的纯数字。

Oracle全文索引的BASIC属性主要是针对西方英语语系,英语语系的单词是通过空格、标点和回车来分隔的。而中文则需要索引来自动切词。[@more@]2看下面这个例子:
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
表已创建。
SQL> INSERT INTO T VALUES (1, '一个中文例子,测试BASIC_LEXER语法属性是否可以正常识别中文。');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT;
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
未选定行
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '一个中文例子') > 0;
ID DOCS
1 一个中文例子,测试BASIC_LEXER语法属性是否可以正常识别中文。
通过BASIC_LEXER来索引中文,Oracle只识别被空格、标点和回车符分隔出来的部分。需要对中文内容进行索引的话,就必须使用中文的LEXER。
Oracle提供了两种预定义的中文LEXER属性:CHINESE_VGRAM_LEXER和CHINESE_LEXER。Oracle在文档上是这样描述的:
CHINESE_LEXER相对应CHINESE_VGRAM_LEXER属性有如下的优点:
产生的索引更小;
更好的查询响应时间;
产生更接近真实的索引切词,使得查询精度更高;
支持停用词。
虽然Oracle说明了使用CHINESE_LEXER的大量好处,但是CHINESE_LEXER的实际效果却存在一定的问题:
SQL> DROP INDEX IND_T_DOCS;
索引已丢弃。
SQL> TRUNCATE TABLE T;
表已截掉。
SQL> INSERT INTO T VALUES (1, '北京大学未名湖');
已创建 1 行。
SQL> INSERT INTO T VALUES (2, '北京邮电大学');
已创建 1 行。
SQL> INSERT INTO T VALUES (3, '北京市第十四中学');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已连接。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_VGRAM_LEXER', 'CHINESE_VGRAM_LEXER');
3 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_LEXER', 'CHINESE_LEXER');
4 END;
5 /
PL/SQL 过程已成功完成。
SQL> CONN YANGTK/YANGTK@YANGTK
已连接。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.TEST_CHINESE_VGRAM_LEXER');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;
ID DOCS
3 北京市第十四中学
2 北京邮电大学
1 北京大学未名湖
SQL> DROP INDEX IND_T_DOCS;
索引已丢弃。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.TEST_CHINESE_LEXER');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;
ID DOCS
2 北京邮电大学
通过对比结果可以发现:使用CHINESE_LEXER 没有将第一条记录和第三条记录中的北京检索出来。也许Oracle的CHINESE_LEXER认为北京大学和北京市是一个完整的词汇,而没有对其进行进 一步切分。也许这就是Oracle提到的这种切分方式更接近于真实的情况。我不知道读者会怎样看待这个问题,不过我更倾向于使用 CHINESE_VGRAM_LEXER,个人感觉返回记录多一些总比漏掉一些要好。

阅读全文

与lex过滤空格相关的资料

热点内容
处理废水的办法的英文 浏览:748
旧滤芯怎么取下来 浏览:873
饮用水除垢器哪种好 浏览:250
反渗透设备能处理TDs 浏览:819
空气净化器80和83什么区别 浏览:813
烟台膜天超滤膜 浏览:944
建设城镇污水处理厂意义 浏览:206
青岛电子超纯水设备多少钱 浏览:676
纯水精灵什么属性 浏览:594
地下井水用什么反渗透膜 浏览:529
蒸馏一层高粱一层稻壳 浏览:307
什么是净水器怎么安装 浏览:587
沁园滤芯换好了以后怎么复位 浏览:814
污水厂一厂一策是什么 浏览:122
出水管怎么换滤芯 浏览:384
校园用的饮水机多少钱哪有卖 浏览:170
三淼污水提升泵 浏览:262
北京洁明过滤器 浏览:1000
埋深4米的污水管道多少钱 浏览:230
科林贝思净水器换好滤芯如何复位 浏览:412