[idle] Ideqta

  • From: Rangel Dokov <rangel_dokov@xxxxxx>
  • To: idle@xxxxxxxxxxxxx
  • Date: Tue, 1 Apr 2003 02:54:47 +0300

Eto i ideqta opisano sravnitelno podrobno. Stava vypros glavno za
strukturite ot danni. V GCC izpolzvat flex/bison taka che trudno da se
otkradne neshto po otnoshenie na parser-a;-).

1. Strukturi ot danni

Celiq kod se predstavq ot edno dyrvo. (vsyshtnost moze bi shte sa nqkolko
no za prostoto na obqsnenieto N=1). Dyrvoto e s nqkolko vida node-ove. Ej
tiq shte gi ima sys sigurnost:

Common - vsichki drugi node-ove imat po edin tykyv. Sydyrza informaciq
obshta za vsichki vidove node-ove.

Type - node predstavqsht tip danni. Takyv node se poluchava pri typedef.

Decl - tova se generira za vseki identifier, kojto ne e neshto izvestno.
Promenlivi, funkcii, label-i, vsichko.

Expr - tova predstavlqva izpylnim kod. Prisvoqvaniq, aritmetichni
operacii, izvikvane na funkcii, etc.

Block - tova predstavlqvat chasti ot koda v {}. (v chisto C maj nqma nuzda
- t.e. nqma takova zhivotno kato `block scope', nqma da pravim i gyzarski
 optimizacii no znae li chovek).


Eto i nqkolko dopylnitelni tipa, koito mozhe bi shte trqbva da slozim:

Integral - tova sa celochisleni konstanti e.g. 5, 123, 0xFF

Float - tova sa konstanti s plavashta zapetq, e.g. 12E-3

List - predstavlqva spisyk ot node-ove. Primerno parametrite na funkciq
mogat da sa ot takyv tip, kakto i elementite v struct.

Vector - pochti syshtoto samo che elementite sa ednakvi. Primerno masivi.
---------------------------------------

Osven obshtata dyrvovidna struktura ima i dosta linejni vryzki iz dyrvoto
i stava poveche kato graph ;-). Primerno za vseki node Type se pazqt
nqkolko direktni ukazatelq kym proizvodni tipove:
int <-> const int <-> int *  (e.g.)
Localnite promenlivi za edna funkciq syshto sa navyrzani. Statementite sa
navyrzani po red na izpylnenie.

A sega i naj-qkata chast. Pravim si edin tip:
union tree_node;
v kojto nablyskvame vsichko po-gore i navsqkyde polzvame pointer kym takyv
tip. Chestno kazano v nachaloto si pomislih che e mnogo dyrvarsko obache e
super qko. Taka v povecheto node-ve ima kupishta vryzki ot tip tree_node*.
Tova pozvolqva sravnitelno lesna promqna na vidovete node-ove (v GCC
izpolzvat 1MB macrosi za da si adresirat poletata ot strukturite i
dyshternite poleta v zavisimost ot `podtipa' na vseki node).


2. Nachin na parse-vane:
Ideqta e koda da se razbie na funkcii i vsqka da si se obrabotva
po-otdelno. Za vsqka funkciq se syzdava Decl node i v nego kato dyshterni
vyrhove se pazqt localni promenlivi i koda. Pazi se parent scope (ako
reshim da poddyrzhame vlozeni funkcii shte trqbva).
Kakto kazah po-gore tezi Decl node-ove se navyrzvat edin za drug v lineen
spisyk.
Vsichko ostanalo e Type i Expression decoding, koito da popylnqt
dyrvetata.

3. Work to be done ;-)
Vse oshte ne sym napisal strukturite. A nqma i kak da gi prepisha ot GCC.
Tam neshtata sa im navyrzani s RTL koda. Osven tova imat poddryzka za C,
C++, Pascal, Java i Chill (a mozhe bi i za LISP shoto se spomenavashe v
komentarite!?!).

Shte trqbva da se napishat vse pak nqkykvi header-i s koito da pochne da
se pishe parser-a.
Otnosno samiq parser ima dve osnovni dejnosti:
Type decoding i
Expression decoding.

Expression decoding imame pisan dosta pyti. Toj Ivo sigurno i na syn mozhe
da napishe reverse Polish notation decoder ;-). Predpolagam che shte e
naj-lesno da vzemem decoder-a ot preprocessor-a i da go modificirame do
neuznavaemost. Kvoto i da pravim shte ima dosta rabota dokato go
podkarame da popylva strukturite ot danni.

Type decoding shte trqbva tepyrva da se misli. Obshto vzeto ne bi trqbvalo
da e koj znae kakva sloznotiq, no ne e i osobenno lek. Samo che za da
mozhe da se napishe trqbva da e napylno izqsneno polozhenieto s Type node.
(ili pyk kojto se hvane da go pishe da si napravi i strukturata kakto mu
haresva). btw tuk spada i koda za proverka za syvmestimost na tipove
shtoto toj mnogo zavisi ot tova kakvi sa strukturite i kak sa popylneni.
Abe golqma kasha si e.

Ima li dobrovolci? Nqkoj iska li da mozhe da se pohvali na gadzeto si che
e *napisal* C kompilator?

(ochakvam komentari v stil ROTFL)


---------------------------------------
Vse pak eto malko `primeri' za po-dobro hranosmilane.

--- Begin Sample 1 ---
typedef int* pint;

Tyk se syzdava node Type. V nego se ukazva che tipa e s ptr_depth=1, i che
e pointer_to=TYPE_INT.
--- End Sample 1 ---

--- Begin Sample 2 ---
int a[10];

Tuk se syzdava node Decl. V nego se zadava tipa na promenlivata (int[]).
Sled, koeto v zavisimost ot tova dali shte izpolzvame node Vector - ili
syzdavame takyv node, ili ukazvame razmer 10.
--- End Sample 2 ---

--- Begin Sample 3 ---
a = b + 3;

Syzdava se edin Integral node za trojkata. Syshto taka tuk se
syzdavat i dva Expr node-a. Ediniq e za `+', drugiq za `='. Na vseki
expression mu se zadavat operandite, (2-ri operand na `=' e node-a na
`+'). Syshto taka se presmqta i tipa na operaciqta (i.e. ako b e float to
b + 3 ima stojnost float).
(E razbirase ako a ili b, ne sa definirani za tqh shte se syzdade Decl
node v kojto da se spomenat. Prosto ima error/warning poleta v koito se
ukazva greshkta, syshto taka ima i poleta za fajl/red na pyrvo sreshtane -
poznajte ot 3 pyti zashto GCC vryshta samo pyrvoto mqsno na var undeclared
;-)
Eto vi i ASCII Art:

   =
  / \
 /   \
a     +
     / \
    /   \
   b     3
--- End Sample 3 ---

-- 
Rangel Dokov

Other related posts:

  • » [idle] Ideqta