導航:首頁 > 凈水問答 > 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過濾空格相關的資料

熱點內容
國產四級電影在線觀看 瀏覽:254
成人影視劇情電影網站。 瀏覽:789
沁園超濾膜沖洗口 瀏覽:113
韓劇電影在線合集 瀏覽:102
幾幾對幾幾的免費電影 瀏覽:691
三亞哪個電影院好 瀏覽:268
環境監測實驗廢水色度測定 瀏覽:548
吳京乘風電影在線免費 瀏覽:980
日本老電影女的開車男的死了,女的被判絞刑 瀏覽:50
鐵柱和紋綉韓國電影 瀏覽:827
嘉美濾芯是什麼意思 瀏覽:876
現在還有在線看的網址嗎 瀏覽:355
中和污水處理廠什麼時候上班 瀏覽:53
廢水中硫酸鹽在多少之間 瀏覽:475
新野哪有賣管道除垢劑的 瀏覽:966
水處理劑都有哪些以及功能 瀏覽:774
污水管網鋪設一米多少錢一米 瀏覽:815
鋁水箱除垢劑 瀏覽:7
外國電影兩個男的穿女裝 瀏覽:98
19禁電影愛情片 瀏覽:743