锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏈鍚?span lang="EN-US">,鍙ソ閫夋嫨鍐嶈涓涓?span lang="EN-US">VC6, 鍡?span lang="EN-US">, 涓や釜VC, 涓嶉敊.
鍏堜粙緇嶄竴涓?span lang="EN-US">Parser Generator,涓婚〉涓嬭澆:http://www.bumblebeesoftware.com/downloads.htm
Parser Generator is a YACC and Lex programming tool for Windows. As well as including a Graphical User Interace, the software also includes two versions of YACC and Lex, called AYACC and ALex. Parser Generator is able to generate C, C++ and Java parsers and lexical analysers. This includes both Unicode and Multibyte Character Set (MBCS) variants. In your applications you can create multiple, thread safe, instances of these parsers and lexical analysers.
涓嬮潰璇翠竴涓?span lang="EN-US">windows鐜涓?span lang="EN-US">parser generator鍜?span lang="EN-US">vc++鐨勫悇欏歸厤緗?span lang="EN-US">
錛堜竴錛?span lang="EN-US">parser generator鐨勭幆澧冭緗?span lang="EN-US">
瀹夎濂?span lang="EN-US">parser generator錛屾墦寮闆嗘垚寮鍙戠幆澧冿紝鐐歸」鐩?span lang="EN-US">Project鑿滃崟錛屽湪涓嬫媺鑿滃崟涓?span lang="EN-US">LibBuilder錛屽脊鍑?span lang="EN-US">LibBuilder瀵硅瘽妗嗛夋嫨灞炴ф寜閽紝寮瑰嚭compiler properties 瀵硅瘽妗嗭細(xì)
Name 閫夋嫨Visual C++ (32-bit)
Directory :msvc32
options:
渚濇涓?vc++鐗堟湰(Versoin 6)
鏄惁鏀寔unicode鐮併?span lang="EN-US">(閫夋嫨榛樿)
鏄惁鎶?span lang="EN-US">w_char_t浣滀負(fù)鍐呭緩綾誨瀷銆?span lang="EN-US">(閫夋嫨榛樿)
涓嬭竟鏄?span lang="EN-US">VC鐨勫悇縐嶇洰褰曪細(xì)
渚濇涓?span lang="EN-US">
Compiler Bin Directory (C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\BIN
Compiler Bin Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\COMMON\MSDEV98\BIN
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\INCLUDE
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\LIB
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\LIB
娉ㄦ剰錛氱紪璇戝櫒瀹夎鐩綍鏍規(guī)嵁涓漢瀹夎鐩綍闇瑕佸仛鐩稿簲鐨勮皟鏁淬傛墍鏈夌殑榪欎簺璁劇疆瀹屾垚涔嬪悗鐐?span lang="EN-US">ok銆?span lang="EN-US">
鏈鍚庝竴姝?span lang="EN-US">,閰嶇疆parser generator鐨?span lang="EN-US">properties,濡傚浘鍗沖彲:
榪斿洖LibBuilder銆傜偣Build灝卞彲浠ョ紪璇?span lang="EN-US">vc++浣跨敤鐨?span lang="EN-US">lex涓?span lang="EN-US">yacc鐨?span lang="EN-US">lib搴撱?span lang="EN-US">
娉?span lang="EN-US">:鎴戝弬鑰?span lang="EN-US">Vs 2003.net鐨勮緗?span lang="EN-US">,鍦?span lang="EN-US">VC 2005涓嬭繘琛岀浉搴旇緗?span lang="EN-US">, 緇撴灉lex涓?span lang="EN-US">yacc鐨?span lang="EN-US">lib搴撴病鑳界紪璇戦氳繃, 鍙兘鏄垜璁劇疆閿欒, 涓嶅簲璇ユ槸灝氫笉鍏煎鐨勯棶棰樺惂.
鐢熸垚搴撴枃浠跺湪杞歡瀹夎鐩綍涓嬬殑D:\Parser Generator 2\Cpp\Lib\msvc32鐩綍涓嬨?span lang="EN-US">
錛堜簩錛?span lang="EN-US">vc++鐜鐨勮緗?span lang="EN-US">
1.鐩綍璁劇疆
涓轟簡鍦?span lang="EN-US">VC++涓彲浠ユ壘鍒板寘鍚枃浠?span lang="EN-US">yacc.h鍜?span lang="EN-US">lex.h浠ュ強(qiáng)YACC鍜?span lang="EN-US">Lex鐨勫簱鏂囦歡錛岄渶瑕佸VC++榪涜鐩稿叧鐨勭洰褰曡緗?span lang="EN-US">
錛?span lang="EN-US">1錛?span lang="EN-US"> 閫夋嫨Tools鑿滃崟涓殑Options鍛戒護(hù)錛屾墦寮Options瀵硅瘽妗嗐?span lang="EN-US">
錛?span lang="EN-US">2錛?span lang="EN-US"> 閫夋嫨Directories閫夐」鍗°?span lang="EN-US">
錛?span lang="EN-US">3錛?span lang="EN-US"> 鍦?span lang="EN-US">Show Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Include Files銆?span lang="EN-US">
鍦?span lang="EN-US">Directories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏?span lang="EN-US"> F:\PARGEN\CPP\INCLUDE(鏍規(guī)嵁涓漢瀹夎鐩綍闇瑕佸仛鐩稿簲鐨勮皟鏁?span lang="EN-US">)
錛?span lang="EN-US">4錛?span lang="EN-US"> 鍦?span lang="EN-US">Show Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Library Files銆?span lang="EN-US">
鍦?span lang="EN-US">Directories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏?span lang="EN-US">F:\PARGEN\CPP\LIB\MSVC32
錛?span lang="EN-US">5錛?span lang="EN-US"> 鍦?span lang="EN-US">Show Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Source Files銆?span lang="EN-US">
鍦?span lang="EN-US">Directories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏?span lang="EN-US">F:\PARGEN\CPP\SOURCE
錛?span lang="EN-US">6錛?span lang="EN-US"> 鐐瑰嚮OK鎸夐挳,Options瀵硅瘽妗嗗皢鎺ュ彈璁劇疆騫跺叧闂?span lang="EN-US">
2錛庨」鐩緗?span lang="EN-US">
瀵逛簬姣忎釜VC++欏圭洰錛岄兘闇鍦?span lang="EN-US">VC++涓繘琛屼互涓嬭緗?/span>錛屼互浣?span lang="EN-US">VC++鍙互浠庣壒瀹氱殑搴撲腑鎺ュ彈LEX鍜?span lang="EN-US">YACC鎵闇瑕佺殑鍑芥暟鍜屽彉閲?span lang="EN-US">
錛?span lang="EN-US">1錛?span lang="EN-US"> 閫夋嫨Project鑿滃崟涓殑Settings鍛戒護(hù)錛屾墦寮Project Settings瀵硅瘽妗嗐?span lang="EN-US">
錛?span lang="EN-US">2錛?span lang="EN-US"> 鍦?span lang="EN-US">Settings for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Win32 Debug銆?span lang="EN-US">
錛?span lang="EN-US">3錛?span lang="EN-US"> 閫夋嫨C/C++閫夐」鍗★紝 鍦?span lang="EN-US">Category涓嬫媺鍒楄〃妗嗕腑閫夋嫨General銆?span lang="EN-US">
鍦?span lang="EN-US">Preprocessor Definitions妗嗕腑錛屽湪褰撳墠鏂囨湰鐨勬渶鍚庯紝杈撳叆
錛?span lang="EN-US" style="color: red">YYDEBUG
娉?span lang="EN-US">:瀵瑰簲鍒?span lang="EN-US">VC 2005涓?span lang="EN-US">C/C++->Preprocessor->Preprocessor Definitions.
錛?span lang="EN-US">4錛?span lang="EN-US"> 閫夋嫨Link閫夐」鍗★紝鍦?span lang="EN-US">Category涓嬫媺鍒楄〃妗嗕腑閫夋嫨General銆?span lang="EN-US">
鍦?span lang="EN-US">Object/Library Modules妗嗕腑錛屽湪褰撳墠鏂囨湰鐨勫悗闈紝杈撳叆yld.lib
娉?span lang="EN-US">:VC 6涓殑Object/Library Modules瀵瑰簲鍒?span lang="EN-US">VC 2005涓?span lang="EN-US">Propert->Configuration Properties->Linker->Input->Additional Dependencies ,鎵句簡濂戒箙.![]()
錛?span lang="EN-US">5錛?span lang="EN-US"> 鍦?span lang="EN-US">Settings for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Win32 Release銆?span lang="EN-US">
錛?span lang="EN-US">6錛?span lang="EN-US"> 閲嶅絎?span lang="EN-US">4姝ョ殑宸ヤ綔銆?span lang="EN-US">
錛?span lang="EN-US">7錛?span lang="EN-US"> 鐐瑰嚮OK鎸夐挳錛?span lang="EN-US">Project Settings瀵硅瘽妗嗚緗畬姣曘?span lang="EN-US">
榪欐牱璁劇疆涔嬪悗鎴戜滑灝卞彲浠ョ敤vc++緙栬瘧Parser Generator 鐢熸垚鐨?span lang="EN-US">c鏂囦歡浜嗐傚叿浣撲負(fù)錛?span lang="EN-US">
鍏堟墦寮Parser Generator 闆嗘垚寮鍙戠幆澧冦傜偣鍑?span lang="EN-US">Project鑿滃崟錛岀偣鍑諱笅鎷夎彍鍗曚腑鐨?span lang="EN-US">ParseWizard鑿滃崟錛屼竴璺笅鍘誨緩绔嬩竴涓伐紼嬨傜劧鍚庣偣鍑?span lang="EN-US">project鑿滃崟涓嬬殑鐨?span lang="EN-US">Rebuild All銆傚湪欏圭洰鏂囦歡澶逛笅灝辯敓鎴愪簡鐩稿簲c鏂囦歡涓?span lang="EN-US">h鏂囦歡銆?span lang="EN-US">
鍐嶇敤VC++寤虹珛涓涓┖鎺у埗鍙板伐紼嬶紝鐒跺悗鎶婄敤鐢?span lang="EN-US">Parser Generator
鐢熸垚鐨?span lang="EN-US">c鏂囦歡鍜屽ご鏂囦歡鍔犲叆宸ョ▼涓傛帴鐫瀵?span lang="EN-US">VC++榪涜涓婇潰鎵璇寸殑欏圭洰璁劇疆錛岀劧鍚庡氨鍙互緙栬瘧榪愯浜嗐傛柊鎵嬪彲浠ヤ嬌鐢?span lang="EN-US">parser generator 鑷甫鐨勮寖渚嬶紝榪欐牱鏂逛究媯(gè)楠岀幆澧冪殑閰嶇疆鏄惁姝g‘.
Lex 鍜?Yacc 鏄?Unix 鍜孡inux 涓嬭瘝娉曞拰璇硶鐨勫垎鏋愶紝瑙f瀽宸ュ叿錛屾湁浜嗚繖涓や釜宸ュ叿錛屼綘鍙互鑷繁鍒朵綔鎯寵鐨勭紪璇戝櫒錛屼篃鍙互閲嶆柊鍒朵綔宸叉湁紼嬪簭璇█鐨勮В鏋愬櫒銆傞渶瑕佹敞鎰忕殑鏄痩inux涓嬬殑榪欎袱涓伐鍏風(fēng)敓鎴愮殑紼嬪簭婧愮爜鍙兘鏄疌鍜孋++璇█錛屽綋鐒剁幇鍦ㄦ棭宸叉湁綾諱技鍙互鐢熸垚Java婧愮爜鐨勮娉曞垎鏋愬櫒錛屽杈冨父鐢ㄧ殑JavaCC(Java Compiler Compiler)錛岀浉鍏沖唴瀹瑰彲浠ュ幓緗戜笂鎼滅儲(chǔ)銆侺ex鍜孻acc宸茶縐繪鍒皐indows涓嬶紝鐜板湪甯哥敤鐨勫伐鍏鋒湁Parser Generator銆傛湰鏂囧彧浠嬬粛Linux 涓婰ex鍜孻acc鐨勪嬌鐢ㄦ柟娉曘?br>
Lex浠嬬粛
Lex 閫氳繃瀵?lex鎴?l鏂囦歡瀹氫箟鐨勬牸寮忕敓鎴愪竴涓狢璇█婧愮爜鏂囦歡錛岄氳繃緙栬瘧榪欎釜婧愮爜錛屽氨鐢熸垚浜?lex鏂囦歡鎴?l鏂囦歡瀹氫箟鐨勭紪璇戝櫒銆?lex鎴?l鏂囦歡鐨勬牸寮忓垎涓夋:
1.鍏ㄥ眬鍙橀噺澹版槑閮ㄥ垎
2.璇嶆硶瑙勫垯閮ㄥ垎
3.鍑芥暟瀹氫箟閮ㄥ垎
浠ヤ笅鏄竴涓畝鍗曠殑渚嬪瓙錛歭ex_example.l鏂囦歡
%{ //鍏ㄥ眬澹版槑閮ㄥ垎
/*鏋楁湪100 linux
www.linmu100.com
*/
#include <stdio.h>
extern char *yytext;
extern FILE *yyin;
int sem_count = 0;
%}
//瑙勫垯瀹氫箟閮ㄥ垎錛?br>%%
[a-zA-Z][a-zA-Z0-9]* {printf("WORD[%s] ", yytext);}
[a-zA-Z0-9\/.-]+ printf("FILENAME ");
\" printf("QUOTE ");
\{ printf("OBRACE ");
\} printf("EBRACE ");
; {sem_count++; printf("SEMICOLON ");}
\n printf("\n");
[ \t]+ /* ignore whitespace */;
%%
//浠ヤ笅涓哄嚱鏁板畾涔夐儴鍒?br>int main(int avgs, char *avgr[])
{
yyin = fopen(avgr[1], "r");
if (!yyin)
{
return 0;
}
yylex();
printf("sem_count : %d\n", sem_count);
fclose(yyin);
return 1;
}
Lex 甯哥敤鏍煎紡濡備笅琛紝甯歌琛ㄨ揪寮忥細(xì)
|
瀛楃 |
鍚箟 |
|
A-Z, 0-9, a-z |
鏋勬垚浜嗛儴鍒嗘ā寮忕殑瀛楃鍜屾暟瀛椼?o:p> |
|
. |
鍖歸厤浠繪剰瀛楃錛岄櫎浜?\n銆?o:p> |
|
- |
鐢ㄦ潵鎸囧畾鑼冨洿銆備緥濡傦細(xì)A-Z 鎸囦粠 A 鍒?Z 涔嬮棿鐨勬墍鏈夊瓧絎︺?o:p> |
|
[ ] |
涓涓瓧絎﹂泦鍚堛傚尮閰嶆嫭鍙峰唴鐨勪換鎰?nbsp;瀛楃銆傚鏋滅涓涓瓧絎︽槸 ^ 閭d箞瀹冭〃紺哄惁瀹氭ā寮忋備緥濡? [abC] 鍖歸厤 a, b, 鍜?C涓殑浠諱綍涓涓?o:p> |
|
* |
鍖歸厤0涓垨鑰呭涓笂榪扮殑妯″紡銆?o:p> |
|
+ |
鍖歸厤1涓垨鑰呭涓笂榪版ā寮忋?o:p> |
|
? |
鍖歸厤0涓垨1涓笂榪版ā寮忋?o:p> |
|
$ |
浣滀負(fù)妯″紡鐨勬渶鍚庝竴涓瓧絎﹀尮閰嶄竴琛岀殑緇撳熬銆?o:p> |
|
{ } |
鎸囧嚭涓涓ā寮忓彲鑳藉嚭鐜扮殑嬈℃暟銆?渚嬪: A{1,3} 琛ㄧず A 鍙兘鍑虹幇1嬈℃垨3嬈°?o:p> |
|
\ |
鐢ㄦ潵杞箟鍏冨瓧絎︺傚悓鏍風(fēng)敤鏉ヨ鐩栧瓧絎﹀湪姝よ〃涓畾涔夌殑鐗規(guī)畩鎰忎箟錛屽彧鍙栧瓧絎︾殑鏈剰銆?o:p> |
|
^ |
鍚﹀畾銆?o:p> |
|
| |
琛ㄨ揪寮忛棿鐨勯昏緫鎴栥?o:p> |
|
"<涓浜涚鍙?gt;" |
瀛楃鐨勫瓧闈㈠惈涔夈傚厓瀛楃鍏鋒湁銆?o:p> |
|
/ |
鍚戝墠鍖歸厤銆傚鏋滃湪鍖歸厤鐨勬ā鐗堜腑鐨?#8220;/”鍚庤窡鏈夊悗緇〃杈懼紡錛屽彧鍖歸厤妯$増涓?#8220;/”鍓嶉潰鐨勯儴鍒嗐傚錛氬鏋滆緭鍏?A01錛岄偅涔堝湪妯$増 A0/1 涓殑 A0 鏄尮閰嶇殑銆?o:p> |
|
( ) |
灝嗕竴緋誨垪甯歌琛ㄨ揪寮忓垎緇勩?o:p> |
甯歌琛ㄨ揪寮忎婦渚?o:p>
|
甯歌琛ㄨ揪寮?o:p> |
鍚箟 |
|
joke[rs] |
鍖歸厤 jokes 鎴?joker銆?o:p> |
|
A{1,2}shis+ |
鍖歸厤 AAshis, Ashis, AAshi, Ashi銆?o:p> |
|
(A[b-e])+ |
鍖歸厤鍦?A 鍑虹幇浣嶇疆鍚庤窡闅忕殑浠?b 鍒?e 鐨勬墍鏈夊瓧絎︿腑鐨?0 涓垨 1涓?o:p> |
浣跨敤lex鎵弿涓婅堪涓句緥鏂囦歡 lex_example.l錛?br>lex lex_example.l
緙虹渷浼?xì)鐢熸垚lex.yy.c鏂囦歡錛岀劧鍚庣敤gcc緙栬瘧榪欎釜鏂囦歡錛屾敞鎰忚鏈?ll閫夐」:
gcc lex.yy.c -o analyse -ll
榪欐牱灝辯敓鎴愪簡涓涓畝鍗曠殑璇嶆硶鍒嗘瀽鍣╝nalyse錛屽亣璁炬湁鏂囦歡demo錛屽叾鍐呭濡備笅鎵紺?
firstword;
secondword;
thirdword
fourthword{
fifthword
}
杈撳叆鍛戒護(hù):
./analyse demo
浼?xì)鏈夊涓嬫槃·哄Q?br>WORD[firstword] SEMICOLON
WORD[secondword] SEMICOLON
WORD[thirdword]
WORD[fourthword] OBRACE
WORD[fifthword]
EBRACE
sem_count : 2
瀹為檯涓婏紝瀵逛簬涓婅堪l(fā)ex_example.l鏂囦歡錛屽嚱鏁板畾涔夐儴鍒嗗彲浠ュ畬鍏ㄧ渷鐣ワ紝鍥犱負(fù)lex浼?xì)鑷姩湄?fù)浣犵敓鎴恗ain鍑芥暟銆傝繖鏃朵粛鐒舵寜涓婅堪鏂規(guī)硶鐢熸垚analyse錛岃緭鍏ュ懡浠?
./analse < demo
緇撴灉濡備笅錛?br>WORD[firstword] SEMICOLON
WORD[secondword] SEMICOLON
WORD[thirdword]
WORD[fourthword] OBRACE
WORD[fifthword]
EBRACE
鍦ㄤ笂榪發(fā)ex_example.l鏂囦歡涓垜浠繕浣跨敤浜嗕袱涓彉閲忥細(xì)
extern char *yytext;
extern FILE *yyin;
榪欎袱涓彉閲忔槸lex鎻愪緵鐨勫閮ㄥ熷彛錛岀敤鎴峰彲浠ユ牴鎹嚜宸遍渶瑕佽嚜宸辨洿鏀癸紝lex鎻愪緵浜嗕互涓嬫帴鍙o細(xì)
Lex 鍙橀噺
|
yyin |
FILE* 綾誨瀷銆?瀹冩寚鍚?lexer 姝e湪瑙f瀽鐨勫綋鍓嶆枃浠躲?o:p> |
|
yyout |
FILE* 綾誨瀷銆?瀹冩寚鍚戣褰?lexer 杈撳嚭鐨勪綅緗?緙虹渷鎯呭喌涓嬶紝yyin 鍜?yyout 閮芥寚鍚戞爣鍑嗚緭鍏ュ拰杈撳嚭銆?o:p> |
|
yytext |
鍖歸厤妯″紡鐨勬枃鏈瓨鍌ㄥ湪榪欎竴鍙橀噺涓紙char*錛夈?o:p> |
|
yyleng |
緇欏嚭鍖歸厤妯″紡鐨勯暱搴︺?o:p> |
|
yylineno |
鎻愪緵褰撳墠鐨勮鏁頒俊鎭傦紙lexer涓嶄竴瀹氭敮鎸併傦級(jí) |
Lex 鍑芥暟
|
yylex() |
榪欎竴鍑芥暟寮濮嬪垎鏋愩?瀹冪敱 Lex 鑷姩鐢熸垚銆?o:p> |
|
yywrap() |
榪?涓鍑芥暟鍦ㄦ枃浠訛紙鎴栬緭鍏ワ級(jí)鐨勬湯灝捐皟鐢ㄣ傚鏋滃嚱鏁扮殑榪斿洖鍊兼槸1錛屽氨鍋滄瑙f瀽銆?鍥犳瀹冨彲浠ョ敤鏉ヨВ鏋愬涓枃浠躲備唬鐮佸彲浠ュ啓鍦ㄧ涓夋錛岃繖灝辮兘澶熻В鏋愬涓枃浠躲?鏂規(guī)硶鏄嬌鐢?yyin 鏂囦歡鎸囬拡錛堣涓婅〃錛夋寚鍚戜笉鍚岀殑鏂囦歡錛岀洿鍒版墍鏈夌殑鏂囦歡閮借瑙f瀽銆傛渶鍚庯紝yywrap() 鍙互榪斿洖 1 鏉ヨ〃紺鴻В鏋愮殑緇撴潫銆?o:p> |
|
yyless(int n) |
榪欎竴鍑芥暟鍙互鐢ㄦ潵閫佸洖闄や簡鍓嶆唫? 涓瓧絎﹀鐨勬墍鏈夎鍑烘爣璁般?o:p> |
|
yymore() |
榪欎竴鍑芥暟鍛婅瘔 Lexer 灝嗕笅涓涓爣璁伴檮鍔犲埌褰撳墠鏍囪鍚庛?o:p> |
浠ヤ笅鏄竴涓綆楀瓧絎︿釜鏁扮殑.l鏂囦歡鍐呭錛屾湁鍏磋叮鐨勬湅鍙嬪彲浠ョ紪璇戣瘯璇?br>%{
/*
鏋楁湪100 linux
www.linmu100.com
*/
int wc = 0; /* word count */
%}
%%
[a-zA-Z]+ { wc++; }
\n|. { /* gobble up */ }
%%
int main(void)
{
int n = yylex();
return n;
}
int yywrap(void)
{
printf("word count: %d\n", wc);
return 1;
}
yacc浠嬬粛
Yacc 鏄?Yet Another Compiler Compiler鐨勭緝鍐欍?Yacc 鐨?GNU 鐗堝彨鍋?Bison銆傚畠鏄竴縐嶈娉曡В鏋愬伐鍏楓傚畠鐢ㄥ反縐戞柉鑼冨紡(BNF, Backus Naur Form)鏉ヤ功鍐欍傛寜鐓ф儻渚嬶紝Yacc 鏂囦歡鏈?.y 鍚庣紑銆?br>瀹為檯涓婏紝yacc鎵嶆槸鐪熸鍒嗘瀽璇硶鐨勬牳蹇冿紝.y鏂囦歡鏍煎紡鍜?l鏂囦歡涓鏍峰垎涓夋錛屼絾姣忎竴孌電殑鎰忎箟鏈夋墍涓嶅悓錛?br>1.鍏ㄥ眬鍙橀噺澹版槑錛岀粓緇撶鍙?緇堢絎﹀彿)澹版槑
2.璇硶瀹氫箟
3.鍑芥暟瀹氫箟
浠ヤ笅鏄竴涓畝鍗曠殑yacc_example.y鏂囦歡錛屽畾涔変簡涓涓畝鍗曠殑璁$畻鍣細(xì)
%{
//鍏ㄥ眬鍙橀噺澹版槑
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE double /*double type for YACC stack; for yylval*/
/*鏋楁湪100 www.linmu100.com */
void yyerror(const char *str)
{
fprintf(stderr, "error:%s\n", str );
}
%}
//緇堢粨絎﹀0鏄?nbsp;
%token NUMBER
%%
lines : lines expr
| lines
| /* e */
| error
;
expr : expr
| expr
| term
;
term : term
| term
| factor
;
factor :
|
|
| NUMBER
;
%%
//浠ヤ笂閮ㄥ垎涓鴻娉曞畾涔夛紝浠ヤ笅閮ㄥ垎涓哄嚱鏁板畾涔?nbsp;
int main(void)
{
return yyparse();
}
int yylex(void)
{
int c;
while ((c = getchar()) ==
if (c ==
ungetc(c, stdin);
scanf("%lf", &yylval);
return NUMBER;
}
return c;
}
浣跨敤yacc鎵弿榪欎釜鏂囦歡錛?br>yacc yacc_example.y
緙虹渷浼?xì)鐢熸垚涓涓獃.tab.c鏂囦歡錛岀劧鍚庣敤gcc緙栬瘧榪欎釜鏂囦歡錛屾敞鎰忚鏈夐夐」 -ll 鎴?nbsp;-ly錛?br>gcc y.tab.c -o analyse -ll
榪愯./analyse錛氱粨鏋滃涓嬪浘鎵紺?![]()
鐜板湪瀵圭収yacc_example.y鏂囦歡璁茶В涓涓?y鏂囦歡鐨勮鍒欙細(xì)
1.鍦ㄥ叏灞鍙橀噺澹版槑閮ㄥ垎錛屽0鏄庝簡涓涓帴鍙e嚱鏁皔yerror錛岃繖涓嚱鏁版槸鐢ㄦ潵鍦ㄥ嚭閿欐椂璋冪敤鐨勩傝繖涓孌典富瑕佹槸澹版槑涓浜涘彉閲忥紝鏁版嵁緇撴瀯錛屽嚱鏁扮敤銆?br>2.%token NUMBER鍒欏0鏄庝簡涓涓粓绔(緇堢粨絎?錛岃繖涓鍙鋒槸鐢盠ex榪斿洖鐨勶紝浼?xì)鍦▂acc璇硶瑙勫垯涓敤鍒般?br>3.璇硶瑙勫垯閮ㄥ垎鍒欏0鏄庝簡璇硶錛?br> 3.1璇硶瑙勫垯瀵瑰鍙湁涓涓帴鍙o紝榪欎竴鐐硅娉ㄦ剰錛屽垵瀛﹁呭父甯鎬細(xì)鐘娉曞澶栨湁澶氫釜鎺ュ彛鐨勯敊璇?br> 3.2鏃犺鏄痩ex鏂囦歡榪樻槸yacc鏂囦歡閮借娉ㄦ剰鏈澶у彲鑳芥х殑璇嶆硶鍜岃娉曡鍒欒鏀懼湪鍐茬獊瑙勫垯鐨勫墠闈紝榪欐牱淇濊瘉浜嗘渶澶у彲鑳借鍒欎細(xì)琚渶鍏堝尮閰嶏紝姣斿lex鏂囦歡涓細(xì)
temperator return T1;
temp return T2;
鍦▂acc鏂囦歡涓紝渚嬪瓙濡備笅
command:
NUMBER CHAR
| NUMBER
;
瀵逛簬.y鏂囦歡榪樿娉ㄦ剰鍏ㄥ眬璇硶錛屼互鍙?qiáng)閫掑綊鐨勮皟鐢ㄣ?br>
鍒濆鑰呭浜巠acc鏂囦歡瑙勫垯鍙兘浼?xì)杈冧负鐢熺枏锛屽叧閿畼q樿澶氬仛涓浜涚粌涔?fàn)銆?br>
Lex 鍜?Yacc 鐨勭粨鍚?br>
lex鍜寉acc緇撳悎鏃墮渶瑕佹敞鎰忕殑鏄?br>lex鏂囦歡澶磋寮曠敤yacc鐢熸垚鐨勫ご鏂囦歡:"y.tab.h"
浠ヤ笅鏄竴涓猯ex鍜寉acc緇撳悎鐨勫疄渚嬶細(xì)
lex_yacc_exp.l鏂囦歡錛?br>%{
/*鏋楁湪100
www.linmu100.com
*/
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
extern char *yytext;
%}
%%
[0-9]+ yylval.number=atoi(yytext); return NUMBER;
heater return TOKHEATER;
heat return TOKHEAT;
on|off yylval.number=!strcmp(yytext,"on"); return STATE;
target return TOKTARGET;
temperature return TOKTEMPERATURE;
[a-z0-9]+ yylval.string=strdup(yytext);return WORD;
\n /* ignore end of line */;
[ \t]+ /* ignore whitespace */;
%%
lex_yacc_exp.y鏂囦歡:
%{
/*鏋楁湪100
www.linmu100.com
*/
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
fprintf(stderr,"error: %s\n",str);
}
int yywrap()
{
return 1;
}
main()
{
yyparse();
}
char *heater="xl
%}
%token TOKHEATER TOKHEAT TOKTARGET TOKTEMPERATURE
%union
{
int number;
char *string;
}
%token <number> STATE
%token <number> NUMBER
%token <string> WORD
%%
commands:
| commands command
;
command:
heat_switch | target_set | heater_select
heat_switch:
TOKHEAT STATE
{
if($2)
printf("\tHeater
else
printf("\tHeat
}
;
target_set:
TOKTARGET TOKTEMPERATURE NUMBER
{
printf("\tHeater
}
;
heater_select:
TOKHEATER WORD
{
printf("\tSelected heater
heater=$2;
}
;
杈撳叆浠ヤ笅鍛戒護(hù)錛屽垎鍒敓鎴恖ex.yy.c錛寉.tab.c錛寉.tab.h涓変釜鏂囦歡錛?br>lex lex_yacc_exp.l
yacc -d lex_yacc_exp.y
gcc lex.yy.c y.tab.c -o analyse -ll
鍒涘緩涓涓娉曠敤渚媎emo錛屽唴瀹瑰涓?
heat on
target temperature 99
heater asdfsieiwef99adsf
杈撳叆./analyse <demo鍒嗘瀽demo鏂囦歡錛屼細(xì)寰楀埌浠ヤ笅緇撴灉:
緇撹錛?br>Lex 鍜?Yacc 鏄緢寮哄ぇ鐨勫伐鍏鳳紝榪欓噷鍙畝鍗曚粙緇嶄簡涓浜涘叆闂ㄧ煡璇嗐?br>The Lex & Yacc Page 涓湁寰堝鏈夎叮鐨勫巻鍙插弬鑰冿紝浠ュ強(qiáng) 闈炲父濂界殑 lex 鍜?yacc 鏂囨。銆?nbsp;
鍙傝冩枃妗o細(xì)
http://www.ibm.com/developerworks/cn/linux/l-lexyac.html
http://blog.csdn.net/ThinkinginLinux/archive/
鍏充簬yacc 鍜?lex 鍜屽湪涓嬮潰閾炬帴鐨勬枃绔犻噷宸茬粡鏈夋墍浠嬬粛浜?br>/html/linuxshijie/20070909/80.html
閾炬帴涓殑鏂囩珷榪樹粙緇嶄簡鍦╨inux涓嬪浣曚嬌鐢▂acc鍜宭ex宸ュ叿錛屼笅闈富瑕佹槸浠嬬粛yacc鍜宭ex鍦╳indows涓嬬殑鐢ㄦ硶銆?/p>
yacc鍜宭ex鍦╳indows宸茬粡縐繪鎴愬姛錛屽叾涓父鐢ㄧ殑涓涓伐鍏峰氨鏄疨arser Generator銆傝繖涓伐鍏蜂嬌鐢▂acc鍜宭ex鑳藉鐢熸垚Visual C++錛孊orland C++錛孫ther C/C++浠ュ強(qiáng)鐩稿叧Java浠g爜銆備笅闈粙緇嶄竴涓嬭繖涓伐鍏鋒槸濡備綍鐢熸垚浠g爜騫朵嬌鐢╒isual C++緙栬瘧鐨勩?br>娉細(xì)鍏充簬Parser Generator鐨勪嬌鐢ㄥ拰閰嶇疆錛屽叾瀹炲湪Parser Generator Help涓凡緇忔湁寰堣緇嗙殑浠嬬粛錛屾劅鍏磋叮鐨勬湅鍙嬪彲浠ュ幓閭i噷鏌ュ埌鏇村鏈夌敤鐨勪俊鎭?br>棣栧厛瑕佸幓http://www.bumblebeesoftware.com/downloads.htm涓嬭澆Parser Generator銆?br>瀹夎瀹屾瘯鍚庯紝鎴戜滑鍙互鍦ㄥ畠鐨勫畨瑁呯洰褰曚笅鎵懼埌涓浜涗緥瀛愪互鍙?qiáng)缂栬瘧绋嬪簭鎵闇鐨勫簱鏂囦歡鍜屾簮鏂囦歡錛岃繖浜涙枃浠跺湪緙栬瘧鏄緢閲嶈銆?br>鍗曠嫭yacc鏂囦歡鐨勭紪璇戙?br>
浠ヤ笅鏄竴涓崟鐙殑yacc鏂囦歡錛屽疄鐜頒竴涓畝鍗曠殑璁$畻鍣ㄥ姛鑳姐?/strong>
%{
/************************************************************
www.linmu100.com
************************************************************/
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE double /* double type for YACC stack */
%}
%token NUMBER
%%
lines : lines expr '\n' { printf("%g\n", $2); }
| lines '\n'
| /* e */
| error '\n' { yyerror("reenter last line:"); yyerrok(); }
;
expr : expr '+' term { $$ = $1 + $3; }
| expr '-' term { $$ = $1 - $3; }
| term
;
term : term '*' factor { $$ = $1 * $3; }
| term '/' factor { $$ = $1 / $3; }
| factor
;
factor : '(' expr ')' { $$ = $2; }
| '(' expr error { $$ = $2; yyerror("missing ')'"); yyerrok(); }
| '-' factor { $$ = -$2; }
| NUMBER
;
%%
int main(void)
{
return yyparse();
}
int yylex(void)
{
int c;
while ((c = getchar()) == ' ');
if (c == '.' || isdigit(c)) {
ungetc(c, stdin);
scanf("%lf", &yylval);
return NUMBER;
}
return c;
}
鎴戜滑鐢≒arser Generator鐨凱roject --> Parser Wizard鍒涘緩涓涓伐紼嬶紝濡備笅鍥炬墍紺猴紝娉ㄦ剰綰㈠湀閮ㄥ垎鐨勮緗細(xì)![]()
榪欐椂錛屾垜浠彲浠ョ湅鍒癙arser Generator甯垜浠嚜鍔ㄧ敓鎴愪簡涓涓猰yparser.y鏂囦歡錛岃娉曡鍒欏氨鍙互鍦ㄨ繖閲屽姞浜嗐?br>![]()
鐜板湪鎴戜滑鎶婂紑澶村睍紺虹殑yacc婧愮爜瀹屽叏瑕嗙洊myparser.y鏂囦歡錛岀劧鍚庣紪璇戯紝鎴愬姛鍚庝細(xì)鐢熸垚涓変釜鏂囦歡錛歮yparser.c錛宮yparser.h錛宮yparser.v
濂斤紝鐜板湪鎴戜滑瑕佸仛鐨勫氨鏄敤vc鏉ョ紪璇憁yparser.c錛宮yparser.h榪欎袱涓枃浠朵簡銆?/p>
鎵撳紑Microsoft Visual C++ 6.0錛屾柊寤轟竴涓伐紼嬨?br>![]()
鐒跺悗灝哖arser Generator鐢熸垚鐨勪袱涓枃浠秏yparser.c錛宮yparser.h瀵煎叆宸ョ▼銆傦紙榪欓噷灝變笉澶氳浜哵-^錛?br>鐜板湪瑕佽緗幆澧冨彉閲忎簡錛岄鍏堣瀵煎叆Parser Generator鐨勫簱鏂囦歡鍜屾簮鏂囦歡銆傚湪宸ュ叿->閫夐」閲岃璁劇疆榪欎簺鐜鍙橀噺銆?br>![]()
璁劇疆瀹岃繖浜涙枃浠跺悗錛岃繕瑕佸湪宸ョ▼->璁劇疆閲屾坊鍔爕l.lib搴擄細(xì)![]()
濂斤紝涓鍒囪緗畬姣曪紝寮濮嬬紪璇戯紝緙栬瘧閫氳繃鍚庯紝灝變細(xì)鐢熸垚yacc_vc.exe鏂囦歡銆?br>鍋囪鏈夋枃浠禿emo.txt錛屾鏂囦歡鍜寉acc_vc.exe鍦ㄥ悓涓涓洰褰曪紝鍏跺唴瀹瑰涓嬶細(xì)
1+3*5
3*4-23
7- 9 *30 - 999
鍦ㄦ鐩綍鐨勫懡浠よ涓嬭繍琛屽涓嬪懡浠わ細(xì)yacc_vc.exe <demo.txt錛屽嵆鍙緱鍒拌綆楃粨鏋滐細(xì)![]()
鍗曠嫭lex鏂囦歡鐨勭紪璇戙?/strong>
浠ヤ笅鏄竴涓崟鐙殑lex鏂囦歡錛屽疄鐜頒竴涓畝鍗曠殑璁$畻鍗曡瘝涓暟鍔熻兘銆?br>%{
/************************************************************
www.linmu100.com
************************************************************/
int wc = 0; /* word count */
%}
%%
[a-zA-Z]+ { wc++; }
\n|. { /* gobble up */ }
%%
int main(void)
{
int n = yylex();
return n;
}
int yywrap(void)
{
printf("word count: %d\n", wc);
return 1;
}
鎴戜滑鐢≒arser Generator鏂板緩涓涓伐紼嬶細(xì)![]()
涓嬩竴姝ラ粯璁ゅ畬鎴愬嵆鍙傝繖鏃訛紝Parser Generator甯垜浠嚜鍔ㄧ敓鎴愪簡涓涓猰ylexer.l鏂囦歡錛岃瘝娉曡鍒欏彲浠ュ湪榪欓噷鍔犮?br>鍚屾牱鐨勶紝鎴戜滑鐢ㄤ笂闈㈠睍紺虹殑lex鏂囦歡鍐呭瀹屽叏瑕嗙洊mylexer.l鏂囦歡錛岀紪璇戝悗鍚屾牱鐢熸垚涓変釜鏂囦歡錛岀劧鍚庣敤VC緙栬瘧鍏朵腑鐨刴yparser.c錛宮yparser.h榪欎袱涓枃浠躲?br>VC鐨勮緗柟娉曞拰涓婇潰緙栬瘧鍗曠嫭yacc鏂囦歡鏃剁殑姝ラ瀹屽叏涓鏍鳳紝鏈緇堜細(xì)鐢熸垚涓涓彲浠ヨ綆楁枃浠跺崟璇嶆暟鐩殑.exe鏂囦歡銆?br>
yacc 鍜?lex鏁村悎鏂囦歡鐨勭紪璇戙?/strong>
浠ヤ笅鍒嗗埆鏄痽acc鏂囦歡鍜宭ex鏂囦歡鐨勫唴瀹癸紝榪欎袱涓枃浠跺叡鍚屽疄鐜頒簡鑷畾涔夌殑涓涓畝鍗曡娉曡鍒欍?br>yacc鏂囦歡鍐呭錛?br>%{
/*
www.linmu100.com
*/
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
fprintf(stderr,"error: %s\n",str);
}
int yywrap()
{
return 1;
}
main()
{
yyparse();
}
char *heater="xl's test";
%}
%token TOKHEATER TOKHEAT TOKTARGET TOKTEMPERATURE
%union
{
int number;
char *string;
}
%token <number> STATE
%token <number> NUMBER
%token <string> WORD
%%
commands:
| commands command
;
command:
heat_switch | target_set | heater_select
;
heat_switch:
TOKHEAT STATE
{
if($2)
printf("\tHeater '%s' turned on\n", heater);
else
printf("\tHeat '%s' turned off\n", heater);
}
;
target_set:
TOKTARGET TOKTEMPERATURE NUMBER
{
printf("\tHeater '%s' temperature set to %d\n",heater, $3);
}
;
heater_select:
TOKHEATER WORD
{
printf("\tSelected heater '%s'\n",$2);
heater=$2;
}
;
lex鏂囦歡鍐呭錛?br>%{
/*
www.linmu100.com
*/
#include <stdio.h>
#include <string.h>
#include "myparser.h" //娉ㄦ剰錛岃繖閲岀殑澶存枃浠惰鍜孭arser Generator鐢熸垚鐨勫ご鏂囦歡鍚嶄竴鏍楓?br>extern char *yytext;
%}
%%
[0-9]+ {yylval.number=atoi(yytext); return NUMBER;}
heater return TOKHEATER;
heat return TOKHEAT;
on|off {yylval.number=!strcmp(yytext,"on"); return STATE;}
target return TOKTARGET;
temperature return TOKTEMPERATURE;
[a-z0-9]+ {yylval.string=strdup(yytext);return WORD;}
\n /* ignore end of line */;
[ \t]+ /* ignore whitespace */;
%%
鐜板湪鐢≒arser Generator鍒涘緩鏂扮殑宸ョ▼錛?br>![]()
鍏朵綑鐨勬楠ゅ拰涓婇潰緙栬瘧yacc鏃剁殑姝ラ鐩稿悓錛屾渶緇堝彲浠ョ敓鎴恇oth_y_l.exe鏂囦歡錛屾斁涓涓猟emo.txt鍜宐oth_y_l.exe鍦ㄥ悓涓涓洰褰曚笅錛宒emo.txt鍐呭濡備笅錛?br>heat on
target temperature 99
heater asdfsieiwef99adsf
鐒跺悗鍦ㄦ鐩綍鐨勫懡浠よ涓嬫墽琛宐oth_y_l.exe <demo.txt寰楀埌錛?br>![]()
浠ヤ笂鍗充負(fù)Parser Generator鐨勪嬌鐢ㄤ互鍙?qiáng)濡備綍鐢╒C緙栬瘧銆?br>/
/*-----Lex & Yacc ----www.linmu100.com ----*/
/
/*-----linux宸ュ叿,Lex & Yacc,windows涓嬫搷浣?---*/
/
/*-----linux閰嶇疆,UNIX,寮婧愯蔣浠?linux鎶鏈?makefile----*/
/
/*----------------------@xiaolin--------------------*/
鍦ㄥ畨瑁呬簡Parser Generator鍚庯紝鎵ц浠ヤ笅姝ラ錛屽嵆鍙嬌VC++緙栬瘧鍜岃繛鎺ョ敱Parser Generator浜х敓鐨勬枃浠躲?
1錛庣洰褰曡緗?
鍦╒C++涓墽琛屼互涓嬫楠わ紝姣忎釜姝ラ鍙墽琛屼竴嬈°?
錛?錛?閫夋嫨Tools鑿滃崟涓殑Options鍛戒護(hù)錛屽湪灞忓箷涓婂嵆浼?xì)鍑虹幇Options瀵硅瘽妗嗐?
錛?錛?閫夋嫨Directories閫夐」鍗°?
錛?錛?鍦⊿how Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Include Files銆?
錛?錛?鍦―irectories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏arser Generator鐨刬nclude瀛愮洰褰曠殑璺緞銆?
錛?錛?鍦⊿how Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Library Files銆?
錛?錛?鍦―irectories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏arser Generator鐨刲ib\msdev瀛愮洰褰曠殑璺緞銆?
錛?錛?鍦⊿how Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Source Files銆?
錛?錛?鍦―irectories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏arser Generator鐨凷ource瀛愮洰褰曠殑璺緞銆?
錛?錛?鐐瑰嚮OK鎸夐挳,Options瀵硅瘽妗嗗皢鎺ュ彈璁劇疆騫跺叧闂?
VC++鍦ㄥ氨鍙互鎵懼埌鍖呭惈鏂囦歡yacc.h鍜宭ex.h浠ュ強(qiáng)YACC鍜孡ex鐨勫簱鏂囦歡銆?
2錛庨」鐩緗?
瀵逛簬姣忎釜VC++欏圭洰錛岄兘闇鍦╒C++涓墽琛屼互涓嬫楠わ細(xì)
錛?錛?閫夋嫨Project鑿滃崟涓殑Settings鍛戒護(hù)錛屽湪灞忓箷涓婂嵆浼?xì)鍑虹幇Project Settings瀵硅瘽妗嗐?
錛?錛?鍦⊿ettings for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Win32 Debug銆?
錛?錛?閫夋嫨C/C++鏍囩銆?
錛?錛?鍦–ategory涓嬫媺鍒楄〃妗嗕腑閫夋嫨General銆?
錛?錛?鍦≒reprocessor Definitions妗嗕腑錛屽湪褰撳墠鏂囨湰鐨勬渶鍚庯紝杈撳叆YYDEBUG銆?
錛?錛?閫夋嫨Link鏍囩銆?
錛?錛?鍦–ategory涓嬫媺鍒楄〃妗嗕腑閫夋嫨General銆?
錛?錛?鍦∣bject/Library Modules妗嗕腑錛屽湪褰撳墠鏂囨湰鐨勫悗闈紝杈撳叆yld.lib ylmtd.lib ylmtdlld.lib銆?
錛?錛?鍦⊿ettings for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Win32 Release銆?
錛?0錛?閲嶅絎?姝ョ殑宸ヤ綔銆?
錛?1錛?鐐瑰嚮OK鎸夐挳錛孭roject Settings瀵硅瘽妗嗗皢鎺ュ彈璁劇疆騫跺叧闂?
VC++鐜板湪鍙互浠庣壒瀹氱殑搴撲腑鎺ュ彈YACC鍜孡ex鎵闇鐨勫嚱鏁板拰鍙橀噺銆?
3錛庡簲鐢?
錛?錛夊湪Parser Generator涓嬬殑緙栬緫紿楀彛杈撳叆YACC婧愮▼搴忥紙鎵╁睍鍚嶅繀欏諱負(fù).y錛夈?
錛?錛夌敤Parser Generator涓嬬殑Project鑿滃崟鐨凜ompile file鍛戒護(hù)緙栬瘧婧愮▼搴忥紝鐢熸垚鐩稿簲鐨凜璇█婧愮▼搴忥紙.cpp錛夈?
錛?錛夌敤VC++緙栬瘧錛岃繛鎺璇█婧愮▼搴忥紝鐢熸垚鍙墽琛岀▼搴忥紙.exe錛夊悗鍗沖彲鎵ц銆?
鐢ㄧ殑VC 2005, 鍜屽師鏉C 6鐨勮緗」瀵瑰簲涓嶄笂, 寰堝鍗婂ぉ閮芥壘涓嶅埌.濂戒笉瀹規(guī)槗鎵懼叏浜? 鍗磋繕鏄紪璇戝嚭閿?
鏈鍚?鍙ソ閫夋嫨鍐嶈涓涓猇C6, 鍡? 涓や釜VC, 涓嶉敊.
鍏堜粙緇嶄竴涓婸arser Generator,涓婚〉涓嬭澆:http://www.bumblebeesoftware.com/downloads.htm
Parser Generator is a YACC and Lex programming tool for Windows. As well as including a Graphical User Interace, the software also includes two versions of YACC and Lex, called AYACC and ALex. Parser Generator is able to generate C, C++ and Java parsers and lexical analysers. This includes both Unicode and Multibyte Character Set (MBCS) variants. In your applications you can create multiple, thread safe, instances of these parsers and lexical analysers.
涓嬮潰璇翠竴涓媤indows鐜涓媝arser generator鍜寁c++鐨勫悇欏歸厤緗?
錛堜竴錛塸arser generator鐨勭幆澧冭緗?
瀹夎濂絧arser generator錛屾墦寮闆嗘垚寮鍙戠幆澧冿紝鐐歸」鐩甈roject鑿滃崟錛屽湪涓嬫媺鑿滃崟涓塋ibBuilder錛屽脊鍑篖ibBuilder瀵硅瘽妗嗛夋嫨灞炴ф寜閽紝寮瑰嚭compiler properties 瀵硅瘽妗嗭細(xì)
Name 閫夋嫨Visual C++ (32-bit)
Directory :msvc32
options:
渚濇涓?vc++鐗堟湰(Versoin 6)
鏄惁鏀寔unicode鐮併?閫夋嫨榛樿)
鏄惁鎶妛_char_t浣滀負(fù)鍐呭緩綾誨瀷銆?閫夋嫨榛樿)
涓嬭竟鏄疺C鐨勫悇縐嶇洰褰曪細(xì)
渚濇涓?br>Compiler Bin Directory (C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\BIN
Compiler Bin Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\COMMON\MSDEV98\BIN
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\INCLUDE
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\LIB
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\LIB
娉ㄦ剰錛氱紪璇戝櫒瀹夎鐩綍鏍規(guī)嵁涓漢瀹夎鐩綍闇瑕佸仛鐩稿簲鐨勮皟鏁淬傛墍鏈夌殑榪欎簺璁劇疆瀹屾垚涔嬪悗鐐筼k銆?br> 鏈鍚庝竴姝?閰嶇疆parser generator鐨刾roperties,濡傚浘鍗沖彲:
榪斿洖LibBuilder銆傜偣Build灝卞彲浠ョ紪璇憊c++浣跨敤鐨刲ex涓巠acc鐨刲ib搴撱?
娉?鎴戝弬鑰僔s 2003.net鐨勮緗?鍦╒C 2005涓嬭繘琛岀浉搴旇緗? 緇撴灉lex涓巠acc鐨刲ib搴撴病鑳界紪璇戦氳繃, 鍙兘鏄垜璁劇疆閿欒, 涓嶅簲璇ユ槸灝氫笉鍏煎鐨勯棶棰樺惂.
鐢熸垚搴撴枃浠跺湪杞歡瀹夎鐩綍涓嬬殑D:\Parser Generator 2\Cpp\Lib\msvc32鐩綍涓嬨?
錛堜簩錛塿c++鐜鐨勮緗?
1.鐩綍璁劇疆
涓轟簡鍦╒C++涓彲浠ユ壘鍒板寘鍚枃浠秠acc.h鍜宭ex.h浠ュ強(qiáng)YACC鍜孡ex鐨勫簱鏂囦歡錛岄渶瑕佸VC++榪涜鐩稿叧鐨勭洰褰曡緗?br>錛?錛?nbsp; 閫夋嫨Tools鑿滃崟涓殑Options鍛戒護(hù)錛屾墦寮Options瀵硅瘽妗嗐?br>錛?錛?nbsp; 閫夋嫨Directories閫夐」鍗°?br>錛?錛?nbsp; 鍦⊿how Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Include Files銆?br> 鍦―irectories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏?F:\PARGEN\CPP\INCLUDE(鏍規(guī)嵁涓漢瀹夎鐩綍闇瑕佸仛鐩稿簲鐨勮皟鏁?
錛?錛?nbsp; 鍦⊿how Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Library Files銆?br> 鍦―irectories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏:\PARGEN\CPP\LIB\MSVC32
錛?錛?nbsp; 鍦⊿how Directories for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Source Files銆?br> 鍦―irectories妗嗕腑錛岀偣鍑?yán)L渶鍚庣殑絀虹洰褰曪紝騫跺~鍏:\PARGEN\CPP\SOURCE
錛?錛?nbsp; 鐐瑰嚮OK鎸夐挳,Options瀵硅瘽妗嗗皢鎺ュ彈璁劇疆騫跺叧闂?
2錛庨」鐩緗?br>瀵逛簬姣忎釜VC++欏圭洰錛岄兘闇鍦╒C++涓繘琛屼互涓嬭緗?/strong>錛屼互浣縑C++鍙互浠庣壒瀹氱殑搴撲腑鎺ュ彈LEX鍜孻ACC鎵闇瑕佺殑鍑芥暟鍜屽彉閲?br>錛?錛?nbsp; 閫夋嫨Project鑿滃崟涓殑Settings鍛戒護(hù)錛屾墦寮Project Settings瀵硅瘽妗嗐?br>錛?錛?nbsp; 鍦⊿ettings for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Win32 Debug銆?br>錛?錛?nbsp; 閫夋嫨C/C++閫夐」鍗★紝 鍦–ategory涓嬫媺鍒楄〃妗嗕腑閫夋嫨General銆?br> 鍦≒reprocessor Definitions妗嗕腑錛屽湪褰撳墠鏂囨湰鐨勬渶鍚庯紝杈撳叆 榪欐牱璁劇疆涔嬪悗鎴戜滑灝卞彲浠ョ敤vc++緙栬瘧Parser Generator 鐢熸垚鐨刢鏂囦歡浜嗐傚叿浣撲負(fù)錛?br>鍏堟墦寮Parser Generator 闆嗘垚寮鍙戠幆澧冦傜偣鍑籔roject鑿滃崟錛岀偣鍑諱笅鎷夎彍鍗曚腑鐨凱arseWizard鑿滃崟錛屼竴璺笅鍘誨緩绔嬩竴涓伐紼嬨傜劧鍚庣偣鍑籶roject鑿滃崟涓嬬殑鐨凴ebuild All銆傚湪欏圭洰鏂囦歡澶逛笅灝辯敓鎴愪簡鐩稿簲c鏂囦歡涓巋鏂囦歡銆?br>鍐嶇敤VC++寤虹珛涓涓┖鎺у埗鍙板伐紼嬶紝鐒跺悗鎶婄敤鐢≒arser Generator
錛孻YDEBUG
娉?瀵瑰簲鍒癡C 2005涓篊/C++->Preprocessor->Preprocessor Definitions.
錛?錛?nbsp; 閫夋嫨Link閫夐」鍗★紝鍦–ategory涓嬫媺鍒楄〃妗嗕腑閫夋嫨General銆?br> 鍦∣bject/Library Modules妗嗕腑錛屽湪褰撳墠鏂囨湰鐨勫悗闈紝杈撳叆yld.lib
娉?VC 6涓殑Object/Library Modules瀵瑰簲鍒癡C 2005涓篜ropert->Configuration Properties->Linker->Input->Additional Dependencies ,鎵句簡濂戒箙.![]()
錛?錛?nbsp; 鍦⊿ettings for涓嬫媺鍒楄〃妗嗕腑閫夋嫨Win32 Release銆?br>錛?錛?nbsp; 閲嶅絎?姝ョ殑宸ヤ綔銆?br>錛?錛?nbsp; 鐐瑰嚮OK鎸夐挳錛孭roject Settings瀵硅瘽妗嗚緗畬姣曘?
鐢熸垚鐨刢鏂囦歡鍜屽ご鏂囦歡鍔犲叆宸ョ▼涓傛帴鐫瀵筕C++榪涜涓婇潰鎵璇寸殑欏圭洰璁劇疆錛岀劧鍚庡氨鍙互緙栬瘧榪愯浜嗐傛柊鎵嬪彲浠ヤ嬌鐢╬arser generator 鑷甫鐨勮寖渚嬶紝榪欐牱鏂逛究媯(gè)楠岀幆澧冪殑閰嶇疆鏄惁姝g‘.
]]>
yacc(Yet Another Compiler Compiler)錛屾槸Unix/Linux涓婁竴涓敤鏉ョ敓鎴愮紪璇戝櫒鐨勭紪璇戝櫒錛堢紪璇戝櫒浠g爜鐢熸垚鍣級(jí)銆倅acc鐢熸垚鐨勭紪璇戝櫒涓昏鏄敤C璇█鍐欐垚鐨勮娉曡В鏋愬櫒錛圥arser錛夛紝闇瑕佷笌璇嶆硶瑙f瀽鍣↙ex涓璧蜂嬌鐢紝鍐嶆妸涓ら儴浠戒駭鐢熷嚭鏉ョ殑C紼嬪簭涓騫剁紪璇戙倅acc鏈潵鍙湪Unix緋葷粺涓婃墠鏈夛紝浣嗙幇鏃跺凡鏅亶縐繪寰Windows鍙?qiáng)鍏朵粬邈^鍙般?br>鍒嗘瀽紼嬪簭鐢熸垚鍣?parser generator)鏄竴涓寚瀹氭煇涓牸寮忎腑鐨勪竴縐嶈璦鐨勮娉曚綔涓哄畠鐨勮緭鍏ワ紝騫朵負(fù)璇ョ璇█浜х敓鍒嗘瀽榪囩▼浠ヤ綔涓哄畠鐨勮緭鍑虹殑紼嬪簭銆傚湪鍘嗗彶涓婏紝鍒嗘瀽紼嬪簭鐢熸垚鍣ㄨ縐頒綔緙栬瘧-緙栬瘧紼嬪簭( compiler- compiler )錛岃繖鏄敱浜庢寜鐓ц寰嬪彲灝嗘墍鏈夌殑緙栬瘧姝ラ浣滀負(fù)鍖呭惈鍦ㄥ垎鏋愮▼搴忎腑鐨勫姩浣滄潵鎵ц銆傜幇鍦ㄧ殑瑙傜偣鏄皢鍒嗘瀽紼嬪簭浠呰冭檻涓虹紪璇戝鐞嗙殑涓涓儴鍒嗭紝鎵浠ヨ繖涓湳璇篃灝辨湁浜涜繃鏃朵簡銆傚悎騫?LALR(1) 鍒嗘瀽綆楁硶鏄竴縐嶅父鐢ㄧ殑鍒嗘瀽鐢熸垚鍣紝瀹冭縐頒綔 Yacc( yet another compiler- compiler )銆傜粰鍑?Yacc 鐨勬璨屾潵錛屽皢浣跨敤Yacc涓?TINY 璇█寮鍙戜竴涓垎鏋愮▼搴忋?br>浣滀負(fù) Yacc 瀵硅鏄庢枃浠朵腑鐨?%token NUMBER 澹版槑鐨勫搴斻俌acc 鍧氭寔瀹氫箟鎵鏈夌殑絎﹀彿璁板彿鏈韓錛岃屼笉鏄粠鍒殑鍦版柟寮曞叆涓涓畾涔夈備絾鏄嵈鏈夊彲鑳介氳繃鍦ㄨ鍙峰0鏄庝腑鐨勮鍙峰悕涔嬪悗涔﹀啓涓涓兼潵鎸囧畾灝嗚祴緇欒鍙風(fēng)殑鏁板瓧鍊箋?br>yacc鐨勮緭鍏ユ槸宸寸鏂寖寮忥紙BNF錛夎〃杈劇殑璇硶瑙勫垯浠ュ強(qiáng)璇硶瑙勭害鐨勫鐞嗕唬鐮侊紝Yacc杈撳嚭鐨勬槸鍩轟簬琛ㄩ┍鍔ㄧ殑緙栬瘧鍣紝鍖呭惈杈撳叆鐨勮娉曡綰︾殑澶勭悊浠g爜閮ㄥ垎銆?br>yacc鏄紑鍙戠紪璇戝櫒鐨勪竴涓湁鐢ㄧ殑宸ュ叿,閲囩敤LALR(1)璇硶鍒嗘瀽鏂規(guī)硶銆?br>Yacc鏈鍒濈敱AT&T鐨凷teven C. Johnson涓篣nix鎿嶄綔緋葷粺寮鍙戯紝鍚庢潵涓浜涘吋瀹圭殑紼嬪簭濡侭erkeley Yacc錛孏NU bison錛孧KS yacc鍜孉braxas yacc闄嗙畫鍑虹幇銆傚畠浠兘鍦ㄥ師鍏堝熀紜涓婂仛浜嗗皯璁告敼榪涙垨鑰呭鍔狅紝浣嗘槸鍩烘湰姒傚康鏄浉鍚岀殑銆?br>鐢變簬鎵浜х敓鐨勮В鏋愬櫒闇瑕佽瘝娉曞垎鏋愬櫒閰嶅悎錛屽洜姝acc緇忓父鍜岃瘝娉曞垎鏋愬櫒鐨勪駭鐢熷櫒鈥斺斾竴鑸氨鏄疞ex鈥斺旇仈鍚堜嬌鐢ㄣ侷EEE POSIX P1003.2 鏍囧噯瀹氫箟浜哃ex鍜孻acc鐨勫姛鑳藉拰闇姹傘?br>http://dickey.his.com/byacc/byacc.html Berkeley Yacc 涓鑸涓烘槸鐩墠鏈濂界殑yacc鍙樼銆備笌bison鐩告瘮錛岄伩鍏嶄簡瀵圭壒瀹氱紪璇戝櫒鐨勪緷璧栥?br>http://www.informatik.uni-freiburg.de/proglang/software/essence/ Essence錛孲cheme鐨凩R(1)璇硶瑙f瀽鍣ㄧ殑鐢熸垚鍣?br>http://download.plt-scheme.org/scheme/plt/collects/parser-tools/ 鐢ㄤ簬DrScheme鐨勮娉曡В鏋愬伐鍏?br>http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/ Coco/R Java鍜孋#鐨勬壂鎻忓拰瑙f瀽鍣?br>http://mhss.nease.net/unix/yacc.html Yacc: 鍙︿竴涓紪璇戝櫒鐨勭紪璇戝櫒,Stephen C. Johnson
IBM鐨勫揩閫熷叆闂?/font>
http://www.ibm.com/developerworks/cn/linux/sdk/lex/
windows涓嬬殑lex涓巠acc宸ュ叿
鍙墍浠ユ帹鑽愬畠鏄洜涓哄畠鐢熸垚鐨刢鏂囦歡鍙互鍦╲c++涓嬮氳繃緙栬瘧銆?br> 涓嬭澆鍦板潃 http://www.bumblebeesoftware.com/downloads.htm
涓嬭澆涔嬪悗錛岃В鍘嬬緝錛岀劧鍚庡畨瑁呫傛墦寮闆嗘垚寮鍙戠幆澧冿紝鐐歸」鐩甈roject鑿滃崟錛屽湪涓嬫媺鑿滃崟涓塋ibBuilder錛屽脊鍑篖ibBuilder瀵硅瘽妗嗛夋嫨灞炴ф寜閽?br>寮瑰嚭compiler properties 瀵硅瘽妗嗭紝
Name 閫夋嫨Visual C++ (32-bit)
Directory :msvc32
options:
渚濇涓?br>vc++鐗堟湰(Versoin 7(.net))銆?br>鏄惁鏀寔unicode鐮併?br>鏄惁鎶妛_char_t浣滀負(fù)鍐呭緩綾誨瀷銆?br>涓嬭竟鏄疺C鐨勫悇縐嶇洰褰曪細(xì)
渚濇涓?br>Compiler Bin Directory (C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\BIN)
Compiler Bin Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\COMMON7\IDE)
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\INCLUDE)
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\PLATFORMSDK\INCLUDE)
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\LIB)
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\PLATFORMSDK\LIB)
娉ㄦ剰錛氭嫭鍙烽噷杈圭殑鏄垜鑷繁緙栬瘧鍣ㄥ畨瑁呯洰褰曪紝涔熻浣犵殑鍜屾垜鐨勪笉涓鏍鳳紝闇瑕佸仛鐩稿簲鐨勮皟鏁淬?br>鎵鏈夌殑榪欎簺璁劇疆瀹屾垚涔嬪悗鐐筼k銆傝繑鍥濴ibBuilder銆傜偣Build灝卞彲浠ョ紪璇憊c++浣跨敤鐨刲ex涓巠acc鐨刲ib搴撱傜敓鎴愬簱鏂囦歡鍦ㄨ蔣浠跺畨瑁呯洰褰曚笅鐨凞:\Parser Generator 2\Cpp\Lib\msvc32鐩綍涓嬨?br>鐒跺悗鎴戜滑鎴戜滑鍦╲c++鐜璁劇疆涓鍔犲寘鍚枃浠剁洰褰旸:\Parser Generator 2\Cpp\Include
lib搴撶洰褰旸:\Parser Generator 2\Cpp\Lib\msvc32
鍏蜂綋璁劇疆
鎵撳紑VC++.net闆嗘垚寮鍙戠幆澧冦?br>鐐瑰伐鍏瘋彍鍗?br>涓嬫媺鑿滃崟涓偣閫夐」鑿滃崟銆?br>寮瑰嚭妗嗕腑鐐瑰乏杈瑰垪琛ㄦ涓殑projects錛岀劧鍚庣偣鍑籿c++鐩綍
鍦ㄦ樉紺轟互涓嬪唴瀹圭洰褰曟爣絳句笅鐨勫垪琛ㄦ涓?#8220;閫夊寘鍚洰褰?#8221;榪涜璁劇疆錛岄?#8220;搴撴枃浠?#8221;榪涜璁劇疆銆?br>鍏蜂綋璁劇疆灝辨槸鐐瑰嚮鍒楄〃妗嗕笅杈逛簲涓寜閽腑鐨勭浜屼釜鎸夐挳錛屽氨鍔犲叆涓琛岋紝褰撻夋嫨“鍖呭惈鐩綍”鐨勬椂鍊欏~鍏:\Parser Generator 2\Cpp\Include錛屽綋閫夋嫨“搴撴枃浠?#8221;鐨勬椂鍊欏~鍏:\Parser Generator 2\Cpp\Lib\msvc32錛屼篃鍙互鐐瑰彸杈圭殑嫻忚鎸夐挳榪涜閫夋嫨銆?br>榪欐牱璁劇疆涔嬪悗鎴戜滑灝卞彲浠ョ敤vc++緙栬瘧鐢≒arser Generator 2鐢熸垚鐨刢鏂囦歡銆傚叿浣撲負(fù)
鎵撳紑Parser Generator 2闆嗘垚寮鍙戠幆澧冦?br>鐐瑰嚮Project鑿滃崟錛岀偣鍑諱笅鎷夎彍鍗曚腑鐨凱arseWizard鑿滃崟錛屼竴璺笅鍘誨緩绔嬩竴涓伐紼嬨傜劧鍚庣偣鍑籶roject鑿滃崟涓嬬殑鐨凴ebuild All銆傚湪欏圭洰鏂囦歡澶逛笅灝辯敓鎴愪簡鐩稿簲c鏂囦歡涓巋鏂囦歡銆?br>鐢╒C++寤虹珛涓涓┖鎺у埗鍙板伐紼嬶紝鐒跺悗鎶婄敤鐢≒arser Generator 2鐢熸垚鐨刢鏂囦歡鍔犲叆宸ョ▼涓傛渶鍚庡紩鍏ュ搷搴旂殑搴撴枃浠訛紝灝辨槸鎴戜滑鍦―:\Parser Generator 2\Cpp\Lib\msvc32鐩綍涓嬬敓鎴愮殑lex涓巠acc搴撴枃浠躲傛帴鐫緙栬瘧錛屽鏋滄垚鍔燂紝閭d箞涓囦簨澶у悏銆?