Compiler Ch5 LL Parser 編譯系統 學習筆記
凌晨1:21Compiler Ch5 LL Parser
First L: 由左到右處理input
Second L: 執行left derivation
LL(K): K代表向前探查K個token
LL(1)
由左到右處理字串,再對句型執行最左推導語法樹,只需向前查看(偷偷看)1個token,就可以推導出來的文法,即是LL(1),當 parser 遇到多種可能的推導方式時,偷偷的看 Predict Set ,找出對應Token ,持續parse直到$
如何計算 Predict Set (所有可能的下一個token)
如果 A -> ABCD
ANS = First(ABCD) #找出第一個terminal
if (ABCD -> λ): #如果會derive 出 lumbda
ANS = ANS 聯集 Follow(A) #那就要再從follow找terminal
return(ANS) #回傳答案
Lumbda 不算是 Terminal , 所以不能算在Set裡
如何確認 Grammer 是 LL(1)
如果 S -> A | B
要符合 LL(1) 的 grammer 有以下條件
- First(A) 跟 First(B) 交集為空
- 兩者至多一個可 derive lumbda
- if B -> lumbda , First(A) 跟 Follow(S) 交集為空
- if A -> lumbda , First(B) 跟 Follow(S) 交集為空
Example
Rule:
S -> A C $
C -> c | λ
A -> a B C d | B Q
B -> b B | λ
Q -> q | λ
建表
Rule Number | A | X1X2…Xn | First(X1X2…Xn) | Derive empty | Follow | Ans |
---|---|---|---|---|---|---|
1 | S | AC$ | abqc$ | N | abqc$ | |
2 | C | c | c | N | c | |
3 | C | λ | Y | d$ | d$ | |
4 | A | aBCd | a | N | a | |
5 | A | BQ | bq | Y | c$ | bqc$ |
6 | B | bB | b | N | b | |
7 | B | λ | Y | cd$ | cqd$ | |
8 | Q | q | q | N | q | |
9 | Q | λ | Y | cd$ | c$ |
檢查條件
檢查4種條件,若都符合即是LL(1)
Recursive-Descient Parser with LL(1)
這種parser搭配LL(1),大致結構就是LL方式判斷,依照rule去match terminal,若是nonterminal,則call它的rule繼續match,遞迴下去求得解答或是判斷出syntax error
Database Ch3 ER Model 資料庫系統導論 學習筆記
凌晨1:17Database Ch3 ER Model
E:entity
R:relationship
ER model 是 database 設計的一種流程
範例:
ER model 常用符號:
Entity: 用來詮釋Mini World的一些物件,大部分是名詞,例如在公司中,有員工 部門 專案 這些entity
Relationship: 用來表示Entity間的關係,就像是離散數學中的relation概念差不多。
Attribute: Entity 或 relationship 的 屬性,例如員工這個Entity有名子 性別 等等屬性
Entity type & key attribute
Entity type:有相同基本類型的entity,可分類成entity type 例如員工type , Project type
Key attribute:在Entity type中,每個entity的這個attribute都不同,則為key attribute,像是身分證號碼
每個entity不一定只有一個key attribute
Relationship & Relation type
一樣同樣type 的 relation 會分到一個relation type
參與這個relation的entity數 = degree
Binary relation -> degree = 2
Ternary relation-> degree = 3
n-ary relation -> degree = n
Relationship 可以relate相同的entity type中的entity
例如 上司關係(員工A,員工B) 員工A是員工B的上司,兩個員工都是屬於員工type
Structural Constraints and Roles
Cardinality Ratio:代表不同個體之間在參與某一個關係時,個體間的實例相互參與之數量比
常見有 1:1 1:N M:N
Participation Constraint:是指某個體中的所有實例,是否一定需要依靠參與某關係,並和另一個體產生關聯而存在。
全部參與 (Total Participation)
部份參與 (Partial Participation)
Min Max Notation:
用來定義relation的參與entity數的最小與最大值
Default: Min=0,Max=1
Weak Entity
弱實體就是必須依靠其他實體才能存在。如果弱實體所依靠的實體消失了, 則該弱實體也就變得沒有意義了。
參考資料
Database Ch2 DBMS概念與架構 資料庫系統導論 學習筆記
凌晨1:15Database Ch2 DBMS概念與架構
Data Model
Data Model: 一組用來描述資料庫結構的概念
Data Model Operation: 依據資料模型指定存取及更新資料庫的動作。在資料模型上的運算可能包含「基本運算」和「使用者定義的運算」
Data Model 的分類:
- Conceptional(high-level):容易讓使用者理解
- Physical(low level):表現資料實際在電腦的儲存方式
- Implementation(record-oriented):介於以上兩者之間
Schema
Database Schema: 資料庫的綱要,包括資料庫的描述與一些限制
Database Instance: 資料庫實例,在某個特殊時間點的資料庫狀態(內容)
schema 很少更改,但 instance 則是每次更新都更改
Three schema architecture
Internal schema: 描述實際的資料庫儲存結構。通常是使用實體(physical model)資料模型
Conceptional schema: 是用來為某一組使用者描述整個資料庫的結構與限制。通常是使用某種概念 (conceptual) 或實作
(implementation)資料模型
External schema: 是用來描述各個不同的使用者檢視表 (view)。它通常使用與概念層相同的資料模型
DBMS必須將External schema的需求轉換成 Conceptional schema的需求,然後再轉換成Internal schema的需求,以便處理實體資料庫
Data Independence
Logical Data Independence: 代表修改Conceptional 時,不必修改 External
Physical Data Independence: 代表修改 Internal時,不必修改 Conceptional
DBMS Language
Data Defination Language(DDL): 是一種能讓DBA與資料庫設計師用來定義Conceptional schema,某些DDL也會定義 Internal (用storage definition language,SDL)與 External (用view definition language,VDL)
Data Maniputation Language(DML): 用來指定資料庫的擷取與修改
DML Command(Data sublangage):
可以嵌入在一般的程式語言裡(主機語言,host
language),如COBOL、C或組合語言,或者是直接執行獨立的(stand-alone)DML命令(也就是查詢語言,query language)
Type of DML
Procedural DML:低階或程序化的,一次一筆記錄;它們是指定如何擷取資料,並且具有如迴圈這類的程式結構
Non-procedural DML:高階或非程序化的,它們是集合導向的(set-oriented),而且是指定要什麼資料,而不是如何擷取,如SQL。也稱作宣告式(declarative)語言
DBMS 分類
依照Data Model分類:
傳統的:Relational, Network, Hierarchical
新興的:Object-oriented, Semantic, Entity-Relationship, other
Database Ch1 資料庫系統導論 第一章 學習筆記
凌晨1:13Database Ch1
基本概念
- Database:Data的集合(Collaction)
- Mini-world:微小世界,用來詮釋真實世界一部分
- DBS:資料庫系統
- DBMS:資料庫管理系統
- DB:資料庫
DBS包含DB跟DBMS
DBMS的目錄(catalog) 中儲存有資料庫的描述,這些描述資料稱為詮釋資料 (metadata)。因此DBMS軟體能與不同的資料庫一起工作
資料庫的使用者
Worker on the scene(檯面上的人):
- Database adminstrators(DBAs): 負責授權存取資料庫、協調及監督資料庫的使用、取得軟硬體資源、控制它的使用和監督運作的效能
- Database Designer: 負責定義資料庫的內容、結構、限制,以及函數和交易。他們必須與終端使用者溝通以了解他們的需求
- 終端使用者:他們會查詢和使用資料來製作報表,其中一部分人可以修改資料庫的內容
Worker behinh the scene:
- DBMS designers and implementers: 負責資料庫管理系統的開發
- Tool developer: 開發DBMS的tools
- Operators and maintenance personel:管理database的硬體環境與軟體環境
參考資料
- 李強老師ppt
- 台大kkchen ppt http://www.lis.ntu.edu.tw/~khchen/course/db/db2007/DBCh01Intro.pdf
Web Crawler In Perl 網路爬蟲
凌晨12:57Web Crawler In Perl 網路爬蟲
因為學校功課的關係,在很短的時間內摸perl的網路爬蟲,用api寫完後才發現老師要我們自己寫parser(乾 早知道不翹課),所以在用RE寫第二遍( )之後一陣子應該都用不到了,所以紀錄下來給未來可能用到的自己或是其他人看Readme
本程式會去爬台南市的三個影城的電影時刻表並且把資料抓下來解析,因為作業要求所以略過一些資訊(是否3dMax之類的),只抓電影名稱跟時間,很簡單的小程式
Sample code Using Regular Expression
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use HTML::LinkExtor;
use Encode;
$browser = LWP::UserAgent->new();
$browser->timeout(10);
&crawler('http://www.atmovies.com.tw/showtime/t06607/a06/');
&crawler('http://www.atmovies.com.tw/showtime/t06608/a06/');
&crawler('http://www.atmovies.com.tw/showtime/t06609/a06/');
sub crawler{
(my $URL) =@_;
my $request = HTTP::Request->new(GET => $URL);
my $response = $browser->request($request);
if ($response->is_error()) {printf "%s\n", $response->status_line;}
$contents = $response->content();
$data = $contents;
while($data =~ m!<ul id="theaterShowtimeTable">(.*?)<ul>(.*?)</ul>(.*?)</ul>!gs)
{
$item=$1;
$otherparse=$3;
$item =~ m!<a href=(.*)>(.*?)</a>!;
$title=$2;
print "$title\n";
while($otherparse =~m!(\d)(\d):(\d)(\d)!gs)
{
print "$1$2:$3$4\n";
}
}
}
sample code using TreeBuilder
use HTML::TreeBuilder;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');
$URL = 'http://www.atmovies.com.tw/showtime/t06607/a06/';
my $tree = HTML::TreeBuilder->new_from_url($URL);
my @items = $tree->look_down('id', 'theaterShowtimeTable' )or die("no items: $!\n");
for my $item (@items)
{
my @movies = $item->look_down( '_tag', 'li' )
or die("no movies$!\n");
$count=0;
for my $movie (@movies)
{
if($count!=1&&$count!=2&&$count!=3)
{
if($movie->attr('class') ne "theaterElse" && $movie->attr('class') ne "filmVersion")
{
print $movie->as_text, "\n";
}
}
$count++;
}
}
First & Follow set
下午6:04Compiler Ch4-Grammer
First and follow
是兩個很重要的Function,用來建構top-down 跟 bottom-up Parser
假設rule是以下這些
S -> ABc
A -> a | B
B -> b | λ
1.First(T)
定義:
將 T (可以是terminal 或 nonterminal) 展開時,可能遇到的第一個 terminal symbol 所成的集合
所以First(A) = { a , b , λ }
First(B) = { b , λ }
2.Follow(T)
定義:
接在T( nonterminal ) 後所有可能的第一個terminal
在開始算Follow之前,先把$(input right end marker)放到Start symbol後
所以Follow(B) = { c , $}
Follow(A) = First(B) + Follow(B) = { b , c }
在算Follow(A)時,即是在找接在A之後的第一個terminal有哪些,
而 S->ABc 因此去尋找B的First set,即是在找A後的第一個terminal,
會發現 First(B) 有 λ,因此當B->λ時,A後的第一個Terminal在Follow(B)內,以此類推。
在 Messenger平台寫聊天機器人Chatbot on Heroku
下午6:481.在facebook Developer 創App 與創粉專
2.寫 code
3.把App deploy 到各大雲端平台
4.設定回呼網址為雲端平台上的app,設定Token
5.測試是否能對話
一開始的流程很簡單就可以爬文爬到,比較麻煩的是編輯 page 的回呼網址,
必須先把app放到雲端平台(Heroku Azure 等等) ,然後 Copy App 的網址,這裡的驗證才會過關
我是採用Heroku https://www.heroku.com/ ,它有很方便的功能,可以與Github做連接,只要與Chatbot的專案做Connenct,就可以與Github同步,Heroku 的免費流量應該足以讓小專案生存,但Heroku的server 在沒人呼叫它超過30分,會休眠就是了。
如果不想讓Heroku休眠,可以嘗試使用 Uptime Robot
它可以在固定時間內發送訊息給伺服器,讓伺服器不休眠,而且服務是免費的,
不過會不會讓Heroku流量爆掉就難說了...