台灣最大程式設計社群網站
線上人數
591
 
會員總數:244807
討論主題:188842
歡迎您免費加入會員
討論區列表 >> C/C++ >> 簡單編譯器撰寫
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
簡單編譯器撰寫
價值 : 40 QP  點閱數:122 回應數:3

樓主

play20217
門外漢
0 5
28 3
發送站內信

請問我要使用Flex和Bison撰寫一個將英文地址轉換成中文的
例如: 5F., No. 23, Aly. 10, Ln. 100, Sec. 7, Zhongshan N. Rd., Shilin Dist., Taipei City 111, Taiwan (R.O.C.)
變成: 臺北市士林區中山北路七段100巷10弄23號5樓
我不知道該如何判斷把英文地址切成token來進行分析
想請問有沒有建議的方法?



搜尋相關Tags的文章: [ flex+bison ] ,
本篇文章發表於2019-06-12 03:26
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

P陳
檢舉此回應
用 Split(英文地址,",") 就可以切開了

5F., No. 23, Aly. 10, Ln. 100, Sec. 7, Zhongshan N. Rd., Shilin Dist., Taipei City 111, Taiwan (R.O.C.)

切後如下:
5F.
No. 23
Aly. 10
Ln. 100
Sec. 7
Zhongshan N. Rd.
Shilin Dist.
Taipei City 111
Taiwan (R.O.C.)
本篇文章回覆於2019-06-12 11:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

play20217
檢舉此回應
因為我想要建立.l和.y的文字檔
"+" {return ADD;}
"-" {return SUB;}
"*" {return MUL;}
"/" {return DIV;}
"|" {return ABS;}
[0-9]+ {yylval=atoi(yytext);return NUMBER;}
\n {return EOL;}
[ \t] {/*空白忽略*/}
. {printf("非法字符 %c\n",*yytext);}
類似這樣的結構該如何做?
本篇文章回覆於2019-06-12 17:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

play20217
檢舉此回應
.l檔:

%{
#include "myGrammar.tab.h"
%}

%%

"F." {printf("%s: is a 樓\n",yytext);return F;}
"No." {printf("%s: is a 號\n",yytext);return NO;}
"Aly." {printf("%s: is a 弄\n",yytext);return ALY;}
"Ln." {printf("%s: is a 巷\n",yytext);return LN;}
"Sec." {printf("%s: is a 段\n",yytext);return SEC;}
"Rd." {printf("%s: is a 路\n",yytext);return RD;}
"Dist." {printf("%s: is a 區\n",yytext);return DIST;}
"City" {printf("%s: is a 市\n",yytext);return CITY;}
[0-9]+ {printf("%s: is a NUMBER\n",yytext);return NUMBER;}
[A-Za-z]+ {printf("%s: is a NAME\n",yytext);return NAME;}
\n {return EOL;}
[ ,\t] {/**/}
. {printf("非法字符 %c\n",*yytext);}

%%

.y檔:

%{
#include <stdio.h>
char *str = (char*) malloc(sizeof(char) * 100);
%}

%token NUMBER NAME
%token F NO ALY LN SEC RD DIST CITY
%token EOL

%%

grammar: /**/
|grammar exp EOL{printf("= %s\n", $2);}
;

exp:factor{ strcat(str, $1);
$$ = str;}
|factor exp{strcat(str, $2);
strcat(str, $1);
$$ = str;}
;

factor:term CITY{strcat(str, $1);
strcat(str, "市");
$$ = str;}
|term DIST{ strcat(str, $1);
strcat(str, "區");
$$ = str;}
|term RD{ strcat(str, $1);
strcat(str, "路");
$$ = str;}
|SEC term{ strcat(str, $1);
strcat(str, "段");
$$ = str;}
|LN term{ strcat(str, $1);
strcat(str, "巷");
$$ = str;}
|ALY term{ strcat(str, $1);
strcat(str, "弄");
$$ = str;}
|NO term{ strcat(str, $1);
strcat(str, "號");
$$ = str;}
|term F{ strcat(str, $1);
strcat(str, "樓");
$$ = str;}
;

term:NUMBER{strcat(str, $1);
$$ = str;}
|NAME{strcat(str, $1);
$$ = str;}
;
%%

int main(int argc,char **argv){
return yyparse();
}

void yyerror(const char* message)
{
fprintf(stderr, "error:%s\n", message);
}

請問我的語法分析好像無法判斷英文地址是否正確,請問哪裡有問題?








本篇文章回覆於2019-06-13 01:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.