The typical compiler consists of several phases each of which passes its output to the next phase
* The lexical phase (scanner) groups characters into lexical units or tokens. The input to the lexical phase is a character stream. The output is a stream of tokens. Regular expressions are used to define the tokens recognized by a scanner (or lexical analyzer). The scanner is implemented as a finite state machine.
* The parser groups tokens into syntactical units. The output of the parser is a parse tree representation of the program. Context-free grammars are used to define the program structure recognized by a parser. The parser is implemented as a push-down automata.
* The contextual analysis phase analyzes the parse tree for context-sensitive information often called the static semantics. The output of the contextual analysis phase is an annotated parse tree. Attribute grammars are used to describe the static semantics of a program.
* The optimizer applies semantics preserving transformation to the annotated parse tree to simplify the structure of the tree and to facilitate the generation of more efficient code.
* The code generator transforms the simplified annotated parse tree into object code using rules which denote the semantics of the source language.
* The peep-hole optimizer examines the object code, a few instructions at a time, and attempts to do machine dependent code improvements.
วันอาทิตย์, มิถุนายน 27, 2547
นั่งอ่านวิธีเขียน grammar ของ yacc ได้พักใหญ่แล้ว...เริ่มเห็นลู่ทาง...ค่อยยังดีหน่อย..
==> Parsing a configuration file
สมมติจะ parse configuration ตัวนี้
zone "." {
type hint;
file "/etc/bind/db.root";
};
เริ่มต้นก็ต้องเขียน lex file ขึ้นมาก่อน return ให้ yacc เข้าพระทัยซะด้วย
%{
#include
#include "y.tab.h"
%}
%%
zone return ZONETOK;
file return FILETOK;
[a-zA-Z][a-zA-Z0-9]* yylval=strdup(yytext); return WORD;
[a-zA-Z0-9\/.-]+ yylval=strdup(yytext); return FILENAME;
\" return QUOTE;
\{ return OBRACE;
\} return EBRACE;
; return SEMICOLON;
\n /* ignore EOL */;
[ \t]+ /* ignore whitespace */;
%%
สังเกตว่า yylval จะไม่ใช่ integer แต่เป็น char * ดังนั้นก็เลยต้อง #define YYSTYPE char * ให้ yacc รู้จักก่อน
ตอนเริ่มเขียน yacc grammer นี้ชักจะเริ่มมั่วนิดส์นึง
เริ่มการ recusive ที่ root
commands:
|
commands command SEMICOLON
;
คือว่าแต่ละ command แยกกันด้วย ";"(semicolon)
command:
zone_set
;
zone_set:
ZONETOK quotedname zonecontent
{
printf("Complete zone for '%s' found\n",$2);
}
;
มี zonecontent ด้วย
zonecontent:
OBRACE zonestatements EBRACE
จะต้องมี { OBRACE และ } EBRACE
quotedname:
QUOTE FILENAME QUOTE
{
$$=$2;
}
นั่นคือ quotedname เท่ากับ filename
NOTE: this grammar chokes on filenames without either a '.' or a '/' in them.
zonestatements:
|
zonestatements zonestatement SEMICOLON
;
zonestatement:
statements
|
FILETOK quotedname
{
printf("A zonefile name '%s' was encountered\n", $2);
}
;
This is a generic statement that catches all kinds of statements within the 'zone' block. We again see the recursiveness.
block:
OBRACE zonestatements EBRACE SEMICOLON
;
statements:
| statements statement
;
statement: WORD | block | quotedname
==> Parsing a configuration file
สมมติจะ parse configuration ตัวนี้
zone "." {
type hint;
file "/etc/bind/db.root";
};
เริ่มต้นก็ต้องเขียน lex file ขึ้นมาก่อน return ให้ yacc เข้าพระทัยซะด้วย
%{
#include
#include "y.tab.h"
%}
%%
zone return ZONETOK;
file return FILETOK;
[a-zA-Z][a-zA-Z0-9]* yylval=strdup(yytext); return WORD;
[a-zA-Z0-9\/.-]+ yylval=strdup(yytext); return FILENAME;
\" return QUOTE;
\{ return OBRACE;
\} return EBRACE;
; return SEMICOLON;
\n /* ignore EOL */;
[ \t]+ /* ignore whitespace */;
%%
สังเกตว่า yylval จะไม่ใช่ integer แต่เป็น char * ดังนั้นก็เลยต้อง #define YYSTYPE char * ให้ yacc รู้จักก่อน
ตอนเริ่มเขียน yacc grammer นี้ชักจะเริ่มมั่วนิดส์นึง
เริ่มการ recusive ที่ root
commands:
|
commands command SEMICOLON
;
คือว่าแต่ละ command แยกกันด้วย ";"(semicolon)
command:
zone_set
;
zone_set:
ZONETOK quotedname zonecontent
{
printf("Complete zone for '%s' found\n",$2);
}
;
มี zonecontent ด้วย
zonecontent:
OBRACE zonestatements EBRACE
จะต้องมี { OBRACE และ } EBRACE
quotedname:
QUOTE FILENAME QUOTE
{
$$=$2;
}
นั่นคือ quotedname เท่ากับ filename
NOTE: this grammar chokes on filenames without either a '.' or a '/' in them.
zonestatements:
|
zonestatements zonestatement SEMICOLON
;
zonestatement:
statements
|
FILETOK quotedname
{
printf("A zonefile name '%s' was encountered\n", $2);
}
;
This is a generic statement that catches all kinds of statements within the 'zone' block. We again see the recursiveness.
block:
OBRACE zonestatements EBRACE SEMICOLON
;
statements:
| statements statement
;
statement: WORD | block | quotedname
วันศุกร์, มิถุนายน 25, 2547
เมื่อวาน OSNews post ข่าวเรื่องราคา WindowsXP ในเมืองไทยด้วย...เอิ้กๆ Thailand to get slimmed-down Windows
Redhat เอาใจ Java Programmer ให้ Eclipse เป็น Development suite รันเป็น Native ซะด้วย โดยใช้ libgcj...หวังว่าคงปรู้ดปร้าด...
Eclipse Goes Native compile ให้เป็น machine code โดยใช้ GCJ Compiler
Eclipse Goes Native compile ให้เป็น machine code โดยใช้ GCJ Compiler
เมื่อคืนนั่งดูบอลคู่โปรตุเกส-อังกฤษ มันส์มากเลยหง่ะ...ด้วยความเกลียดอังกฤษ...ได้เห็นสิงโตเขี้ยวหักนี้รู้สึกสะใจยังไงพิกล
อังกฤษนั้นเล่นไม่ได้เรื่องอยู่แล้ว...จากการวิเคราะห็ดูแล้ว...อังกฤษไม่มีตัวครองบอลแบบติดตีนซักคนนึง...ก็เลยไม่มีตัวป่วนเกมรับโปรตุเกสได้เลย
เน้นสาดยาวให้ owen วิ่ง..ปรู้ดๆ.. ส่วนโปรตุเกสนั้นก็ถือว่ายังเล่นห่วย..ถ้าเจอทีมรุกดีๆน่าจะต้านไม่อยู่...Figo เล่นไม่เอาถ่านเลย...จ่ายบอลไม่ได้เสียวซักลูก...ยิง freekick ข้ามคานไปสอง...ไม่สมกับเป็นจอมทัพเลย...แม่งลุ้นให้เปลี่ยนออก...แล้วก็ถูกเปลี่ยนออกจนได้...เอาใครลงมาไม่รู้...เสือกยิงได้...Rui Costa ก็ยิงได้ด้วย...เจ๋งเป้งไปเลย...แต่ตอนยิงลูกโทษ..ยิงนก...ตอนนั่งดูพูดยังไม่ทันขาดคำเลยว่า Rui Costa ชอบยิงข้ามคาน สังเกตจากเวลาเล่นในเวลา...ยิงโด่งตลอดเลย...และที่ฮาสุดๆ..คือ Beckham ยิงจุดโทษไม่เข้า( 3 ครั้งล่าสุด ยิง 3 เข้า 0) 5555+ ตลก..
อังกฤษนั้นเล่นไม่ได้เรื่องอยู่แล้ว...จากการวิเคราะห็ดูแล้ว...อังกฤษไม่มีตัวครองบอลแบบติดตีนซักคนนึง...ก็เลยไม่มีตัวป่วนเกมรับโปรตุเกสได้เลย
เน้นสาดยาวให้ owen วิ่ง..ปรู้ดๆ.. ส่วนโปรตุเกสนั้นก็ถือว่ายังเล่นห่วย..ถ้าเจอทีมรุกดีๆน่าจะต้านไม่อยู่...Figo เล่นไม่เอาถ่านเลย...จ่ายบอลไม่ได้เสียวซักลูก...ยิง freekick ข้ามคานไปสอง...ไม่สมกับเป็นจอมทัพเลย...แม่งลุ้นให้เปลี่ยนออก...แล้วก็ถูกเปลี่ยนออกจนได้...เอาใครลงมาไม่รู้...เสือกยิงได้...Rui Costa ก็ยิงได้ด้วย...เจ๋งเป้งไปเลย...แต่ตอนยิงลูกโทษ..ยิงนก...ตอนนั่งดูพูดยังไม่ทันขาดคำเลยว่า Rui Costa ชอบยิงข้ามคาน สังเกตจากเวลาเล่นในเวลา...ยิงโด่งตลอดเลย...และที่ฮาสุดๆ..คือ Beckham ยิงจุดโทษไม่เข้า( 3 ครั้งล่าสุด ยิง 3 เข้า 0) 5555+ ตลก..
วันพุธ, มิถุนายน 23, 2547
ไม่ได้ up blog หลายวันเหลือเกิน :
debian ที่ใช้อยู่นี้ก็ถือว่า work ดี
ลง suse9.1 personal แล้วใน notebook
พอดีเครื่องไม่แรง...ผลออกมาเลยทุเรศ...
อืดมากๆ...
งานหลักที่ต้องทำตอนนี้ก็ต้องสร้าง engine สำหรับ packet monitoring program
ของตัวเอง....ซึ่งต้องสร้างภาษาขึ้นมาเป็น data-driven language(packet-driven)
มั่วๆอยู่... อีกไม่นานคง work
debian ที่ใช้อยู่นี้ก็ถือว่า work ดี
ลง suse9.1 personal แล้วใน notebook
พอดีเครื่องไม่แรง...ผลออกมาเลยทุเรศ...
อืดมากๆ...
งานหลักที่ต้องทำตอนนี้ก็ต้องสร้าง engine สำหรับ packet monitoring program
ของตัวเอง....ซึ่งต้องสร้างภาษาขึ้นมาเป็น data-driven language(packet-driven)
มั่วๆอยู่... อีกไม่นานคง work
วันพุธ, มิถุนายน 09, 2547
วันอังคาร, มิถุนายน 08, 2547
สมัครสมาชิก:
บทความ (Atom)