Alef

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 38

Alef Language Reference Manual

Phil Winterbottom
philw@plan9.att.com

Introduction
)lAB EI = ?on?KHHAnJ FHoCH=mmEnC l=nCK=CA @AIECnA@ BoH IOIJAmI IoBJM=HA. -N?AF­
JEon D=n@lEnC, FHo?AII m=n=CAmAnJ, =n@ IOn?DHonEz=JEon FHEmEJELAI =HA EmFlAmAnJA@ >O
JDA l=nCK=CA. 2HoCH=mI ?=n >A MHEJJAn KIEnC >oJD ID=HA@ L=HE=>lA =n@ mAII=CA F=IIEnC
F=H=@ECmI. -NFHAIIEonI KIA JDA I=mA IOnJ=N =I +, >KJ JDA JOFA IOIJAm EI IK>IJ=nJE=llO
@EBBAHAnJ. )lAB IKFFoHJI o>jA?J-oHEAnJA@ FHoCH=mmEnC JDHoKCD IJ=JE? EnDAHEJ=n?A =n@
EnBoHm=JEon DE@EnC. 6DA l=nCK=CA @oAI noJ FHoLE@A C=H>=CA ?ollA?JEon, Io FHoCH=mI =HA
ANFA?JA@ Jo m=n=CA JDAEH oMn mAmoHO. 6DEI m=nK=l FHoLE@AI = >=HA @AI?HEFJEon oB JDA
IOnJ=N=n@IAm=nJE?IoBJDA?KHHAnJEmFlAmAnJ=JEon.
MK?D oB JDA JAHmEnoloCO KIA@ En JDEI m=nK=l EI >oHHoMA@ BHom JDA )N51 + l=n­
CK=CA HABAHAn?A m=nK=l =n@ JDA 2l=n ' m=nK=l. 6DA m=nK=l ANFA?JI B=mElE=HEJO MEJD
>oJD.

1. Lexical
+omFEl=JEon IJ=HJI MEJD = FHAFHo?AIIEnC FD=IA. )n )N51 + FHAFHo?AIIoH EI KIA@.
6DA FHAFHo?AIIoH FAHBoHmI BElA En?lKIEon =n@ m=?Ho IK>IJEJKJEon. +ommAnJI =n@ lEnAI
>ACEnnEnC MEJD JDA # ?D=H=?JAH =HA ?onIKmA@ >O JDA FHAFHo?AIIoH. 6DA FHAFHo?AIIoH
FHo@K?AI=IAGKAn?AoBJokAnIBoHJDA?omFElAH.

1.1. Tokens
6DA lANE?=l =n=lOzAH ?l=IIEBEAI JokAnI =I: E@AnJEBEAHI, JOFAn=mAI, kAOMoH@I, ?on­
IJ=nJI, =n@ oFAH=JoHI. 6okAnI =HA IAF=H=JA@ >O MDEJA IF=?A, MDE?D EI ECnoHA@ En JDA
IoKH?A AN?AFJ =I nAA@A@ Jo IAF=H=JA IAGKAn?AI oB JokAnI MDE?D MoKl@ oJDAHMEIA >A
=m>ECKoKI. 6DA lANE?=l =n=lOzAH EI CHAA@O: EB JokAnI D=LA >AAn ?onIKmA@ KF Jo = CELAn
?D=H=?JAH, JDAn JDA nANJ JokAn MEll >A JDA lonCAIJ IK>IAGKAnJ IJHEnC oB ?D=H=?JAHI JD=J
BoHmI=lAC=lJokAn.

1.2. Reserved Words


6DA BolloMEnC kAOMoH@I =HA HAIAHLA@ >O JDA l=nCK=CA =n@ m=O noJ >A KIA@ =I E@An­
JEBEAHI:
­ ­

adt aggr alloc


alt become break
byte case chan
check continue default
do else enum
extern float for
goto if int
intern lint nil
par proc raise
rescue return sint
sizeof switch task
tuple typedef typeof
uint ulint unalloc
union usint void
while zerox

6DABolloMEnCIOm>olI=HAKIA@=IIAF=H=JoHI=n@oFAH=JoHIEnJDAl=nCK=CA:
+ − / =
> < ! %
& | ? .
" ’ { }
[ ] ( )
* ;

6DABolloMEnCmKlJE-?D=H=?JAHIAGKAn?AI=HAKIA@=IoFAH=JoHI:
+= −= /= *=
%= &= |= ^=
<<= >>= == !=
−− <− −> ++
:: :=

1.3. Comments
+ommAnJI =HA HAmoLA@ >O JDA FHAFHo?AIIoH. ) ?ommAnJ IJ=HJI MEJD JDA ?D=H=?JAHI
/* =n@ BEnEIDAI =J JDA ?D=H=?JAHI */. ) ?ommAnJ m=O En?lK@A =nO IAGKAn?A oB ?D=H=?­
JAHIEn?lK@EnC /*. +ommAnJI@onoJnAIJ.

1.4. Identifiers
)n E@AnJEBEAH, =lIo ?=llA@ = lANE?=l n=mA, EI =nO IAGKAn?A oB =lFD=-nKmAHE? ?D=H=?­
JAHI =n@ JDA Kn@AHI?oHA ?D=H=?JAH _. 1@AnJEBEAHI m=O noJ IJ=HJ MEJD = @ECEJ. 1@AnJEBEAHI
=HA ?=IA IAnIEJELA. )ll ?D=H=?JAHI =HA IECnEBE?=nJ. 1@AnJEBEAHI >ACEnnEnC MEJD JDA IJHEnC
ALEF =HAHAIAHLA@BoHKIA>OJDAHKnJEmAIOIJAm.

1.5. Constants
6DAHA=HABELAJOFAIoB?onIJ=nJ:
constant:
integer−const
character−const
floating−const
string−const
rune−string−const
)n EnJACAH ?onIJ=nJ EI = IAGKAn?A oB @ECEJI. ) FHABEN m=O >A KIA@ Jo mo@EBO JDA >=IA oB
=nKm>AH. ,ABEnA@FHABENAI,>=IAI,=n@@ECEJIAJI=HA:
­!­

none decimal 0−9


0x hexadecimal 0−9 a−f A−F
0 octal 0−7

) ?D=H=?JAH ?onIJ=nJ ?onJ=EnI onA oH moHA ?D=H=?JAHI IKHHoKn@A@ >O IEnClA GKoJA m=HkI
’. 1B JDA ?onIJ=nJ ?onJ=EnI JMo oH moHA ?D=H=?JAHI JDA BEHIJ mKIJ >A JDA AI?=FA ?D=H=?­
JAH \. 6DA BolloMEnC J=>lA IDoMI L=lE@ ?D=H=?JAHI =BJAH =n AI?=FA =n@ JDA L=lKA oB JDA
?onIJ=nJ:
0 NUL NKll ?D=H=?JAH
n NL NAMlEnA
r CR +=HHE=CA HAJKHn
t HT 0oHEzonJ=l J=>
b BS *=?kIF=?A
f FF .oHm BAA@
a BEL *AAF
v VT 8AHJE?=l J=>
\ \ *=?kIl=ID
" " ,oK>lA GKoJA

+D=H=?JAH ?onIJ=nJI D=LA JDA JOFA int. 6DA H=nCA oB L=lKAI JDAO Dol@ @AFAn@I on JDA
?D=H=?JAH IAJ. 1n 2l=n ', JDA EnFKJ JANJ EI En 76. =n@ ?D=H=?JAH ?onIJ=nJI Dol@ JDA $->EJ
HAFHAIAnJ=JEon oB JDA 7nE?o@A ?D=H=?JAH IAA rune$ En 8olKmA  oB JDA 2l=n '
2HoCH=mmAHIM=nK=l.
) Blo=JEnC FoEnJ ?onIJ=nJ ?onIEIJI oB =n EnJACAH F=HJ, = FAHEo@, = BH=?JEon=l F=HJ, JDA
lAJJAH e =n@ =n ANFonAnJ F=HJ. 6DA EnJACAH, BH=?JEon =n@ ANFonAnJ F=HJI mKIJ ?onIEIJ oB
@A?Em=l @ECEJI. -EJDAH JDA EnJACAH oH BH=?JEon=l F=HJI m=O >A omEJJA@. -EJDAH JDA @A?Em=l
FoEnJ oH JDA lAJJAH e =n@ JDA ANFonAnJ m=O >A omEJJA@. 6DA EnJACAH F=HJ oH FAHEo@ =n@
JDA ANFonAnJ F=HJ m=O >A FHA?A@A@ >O JDA Kn=HO + oH − oFAH=JoHI. .lo=JEnC FoEnJ ?on­
IJ=nJID=LAJDAJOFA float.
) IJHEnC ?onIJ=nJ EI = IAGKAn?A oB ?D=H=?JAHI >AJMAAn @oK>lA GKoJA m=HkI ". )
IJHEnC D=I JDA JOFA IJ=JE? =HH=O oB >OJA. ) N7L zAHo ?D=H=?JAH EI =KJom=JE?=llO
=FFAn@A@ Jo JDA IJHEnC >O JDA ?omFElAH. 6DA ABBA?J oB mo@EBOEnC = IJHEnC ?onIJ=nJ EI
EmFlAmAnJ=JEon @AFAn@AnJ. 6DA sizeof oFAH=JoH =FFlEA@ Jo = IJHEnC ?onIJ=nJ OEAl@I
JDAnKm>AHoB>OJAIEn?lK@EnCJDA=FFAn@A@N7L.
) HKnA IJHEnC ?onIJ=nJ EI = IAGKAn?A oB 7nE?o@A ?D=H=?JAHI EnJHo@K?A@ >O $" =n@
JAHmEn=JA@>O ". )HKnAIJHEnCD=IJDAJOFAIJ=JE?=HH=OoBKIEnJ. )zAHoHKnA?D=H=?JAH
EI =KJom=JE?=llO =FFAn@A@ Jo JDA IJHEnC >O JDA ?omFElAH. 6DA sizeof oFAH=JoH =FFlEA@
Jo = HKnA IJHEnC ?onIJ=nJ OEAl@I JDA nKm>AH oB HKnAI, En?lK@EnC JDA =FFAn@A@ zAHo,
JEmAI sizeof (usint).

1.6. Programs
)n )lAB FHoCH=m EI = lEIJ oB @A?l=H=JEonI IJoHA@ En onA oH moHA IoKH?A files. 6DA
@A?l=H=JEonI EnJHo@K?A E@AnJEBEAHI. 1@AnJEBEAHI m=O @ABEnA L=HE=>lAI, JOFAI, BKn?JEonI,
BKn?JEon FHoJoJOFAI, oH AnKmAH=JoHI. 1@AnJEBEAHI D=LA =IIo?E=JA@ storage classes =n@
scope IAA 5A?JEon . .oH BKn?JEonI =n@ L=HE=>lAI @A?l=HA@ =J JDA BElA I?oFA JDA IJoH=CA
?l=II@AJAHmEnAIEB=@ABEnEJEon?=n>A=??AIIA@BHom=noJDAHBElA.

1.7. Processes and Tasks


6DA JAHm process EI KIA@ Jo HABAH Jo = FHAAmFJELAlO I?DA@KlA@ thread oB ANA?KJEon.
) FHo?AII m=O ?onJ=En IALAH=l J=IkI. ) task EI = non-FHAAmFJELAlO I?DA@KlA@ ?oHoKJEnA
MEJDEn = FHo?AII. 6DA mAmoHO mo@Al @oAI noJ @ABEnA JDA ID=HEnC oB mAmoHO >AJMAAn
FHo?AIIAI. On = ID=HA@ mAmoHO ?omFKJAH FHo?AIIAI MEll JOFE?=llO ID=HA JDA I=mA
=@@HAII IF=?A. On = mKlJE?omFKJAH FHo?AIIAI m=O >A lo?=JA@ on FDOIE?=llO @EIJ=nJ
no@AI MEJD =??AII onlO Jo lo?=l mAmoHO. 1nIK?D=IOIJAmFHo?AIIAIMoKl@noJID=HAJDA
­"­

I=mA=@@HAIIIF=?A,=n@mKIJ?ommKnE?=JAKIEnCmAII=CAF=IIEnC.
) CHoKF oB J=IkI ANA?KJEnC MEJDEn JDA ?onJANJ oB = FHo?AII =HA @ABEnA@ Jo >A En JDA
I=mA =@@HAII IF=?A. 6=IkI =HA I?DA@KlA@ @KHEnC ?ommKnE?=JEon =n@ IOn?DHonEz=JEon
oFAH=JEonI. 6DA JAHm thread EI KIA@ MDAHALAH JDA @EIJEn?JEon >AJMAAn = FHo?AII =n@ =
J=IkEIKnEmFoHJ=nJ.

2. Definitions and Declarations


) @A?l=H=JEon EnJHo@K?AI =n E@AnJEBEAH =n@ IFA?EBEAI EJI JOFA. ) @ABEnEJEon EI = @A?l=­
H=JEon JD=J =lIo HAIAHLAI IJoH=CA BoH =n E@AnJEBEAH. )n o>jA?J EI =n =HA= oB mAmoHO oB
knoMn JOFA FHo@K?A@ >O = @ABEnEJEon. .Kn?JEon FHoJoJOFAI, L=HE=>lA @A?l=H=JEonI FHA­
?A@A@ >O extern, =n@ JOFA IFA?EBEAHI =HA @A?l=H=JEonI. .Kn?JEon @A?l=H=JEonIMEJD>o@­
EAI=n@L=HE=>lA@A?l=H=JEonI=HAAN=mFlAIoB@ABEnEJEonI.

2.1. Scope
1@AnJEBEAHIMEJDEn=FHoCH=mD=LAI?oFA. 6DAHA =HA BoKH lALAlI oB I?oFA: lo?=l, BKn?­
JEon,JOFA,=n@BElA:
 ) lo?=l E@AnJEBEAH EI @A?l=HA@ =J JDA IJ=HJ oB = >lo?k. ) lo?=l D=I I?oFA IJ=HJEnC BHom
EJI@A?l=H=JEonJoJDAAn@oBJDA>lo?kEnMDE?DEJM=I@A?l=HA@.
 -N?AFJEon E@AnJEBEAHI =n@ l=>AlI D=LA JDA I?oFA oB = BKn?JEon. 6DAIA E@AnJEBEAHI ?=n
>A HABAHAn?A@ BHom JDA IJ=HJ oB = BKn?JEon Jo EJI An@, HAC=H@lAII oB FoIEJEon oB JDA
@A?l=H=JEon.
 ) mAm>AH oB = ?omFlAN JOFA EI En I?oFA onlO MDAn = @AHABAHAn?EnC oFAH=JoH . oH
−> EI =FFlEA@ Jo =n o>jA?J oB JDA JOFA. 0E@@An JOFA mAm>AHI D=LA IFA?E=l I?oFA
=n@m=OonlO>AHABAHAn?A@>OBKn?JEonmAm>AHIoBJDAJOFA.
 )ll @ABEnEJEonI oKJIE@A oB = BKn?JEon >o@O D=LA JDA I?oFA oB BElA. 7nGK=lEBEA@ @A?l=­
H=JEonI=JJDABElAI?oFAD=LAIJ=JE?IJoH=CA?l=II.

2.2. Storage classes


6DAHA =HA JDHAA IJoH=CA ?l=IIAI: =KJom=JE?, F=H=mAJAH =n@ IJ=JE?. )KJom=JE?
o>jA?JI =HA ?HA=JA@ =J AnJHO Jo JDA >lo?k En MDE?D JDAO MAHA @A?l=HA@. 6DA L=lKA oB =n
=KJom=JE? EI Kn@ABEnA@ KFon ?HA=JEon. )KJom=JE? L=HE=>lAI =HA @AIJHoOA@ =J >lo?k ANEJ.
2=H=mAJAHI =HA ?HA=JA@ >O BKn?JEon EnLo?=JEon =n@ =HA @AIJHoOA@ =J BKn?JEon ANEJ. 5J=JE?
o>jA?JI ANEIJ BHom EnLo?=JEon oB JDA FHoCH=m KnJEl JAHmEn=JEon. 5J=JE? o>jA?JI MDE?D
D=LAnoJ>AAnEnEJE=lEzA@D=LAJDAL=lKA.

3. Types
) Im=ll IAJ oB >=IE? JOFAI EI @ABEnA@ >O JDA l=nCK=CA. MoHA ?omFlAN JOFAI m=O >A
@AHELA@BHomJDA>=IE?JOFAI.

3.1. Basic types


6DA>=IE?JOFAI=HA:
­#­

_________________________________________________
_________________________________________________
n=mA  IEzA  JOFA 
 byte  & >EJI  KnIECnA@>OJA 
_________________________________________________
  
sint  $>EJI  IECnA@IDoHJEnJACAH
_________________________________________________ 
_________________________________________________
usint  $>EJI  KnIECnA@IDoHJEnJACAH 
   
int  ! >EJI  IECnA@EnJACAH
_________________________________________________ 
_________________________________________________
uint  ! >EJI  KnIECnA@EnJACAH 
 float  $">EJI  Blo=JEnCFoEnJ 
_________________________________________________
  
lint  $">EJI  lonCIECnA@EnJACAH
_________________________________________________ 
_________________________________________________
ulint  $">EJI  KnIECnA@lonCEnJACAH 
   
chan  ! >EJI  ?D=nnAl
_________________________________________________ 
_________________________________________________
FolO  $">EJI  FolOmoHFDE?JOFA 

6DA IEzA CELAn BoH JDA >=IE? JOFAI EI JDA mEnEmKm nKm>AH oB >EJI HAGKEHA@ Jo HAFHAIAnJ
JD=J JOFA. 6DA BoHm=J =n@ FHA?EIEon oB float EI EmFlAmAnJ=JEon @AFAn@AnJ. 6DA
float JOFA IDoKl@ >A JDA DECDAIJ FHA?EIEon Blo=JEnC FoEnJ FHoLE@A@ >O JDA D=H@M=HA.
6DA lint =n@ ulint JOFAI =HA noJ F=HJ oB JDA ?KHHAnJ EmFlAmAnJ=JEon >KJ D=LA >AAn
@ABEnA@. 6DA =lECnmAnJ oB JDA >=IE? JOFAI EI EmFlAmAnJ=JEon @AFAn@AnJ. +D=nnAlI =HA
EmFlAmAnJA@ >O JDA HKnJEmA IOIJAm =n@ mKIJ >A =llo?=JA@ >ABoHA KIA. 6DAO =HA JDA IEzA
oB = FoEnJAH. 2olOmoHFDE? JOFAI =HA HAFHAIAnJA@ >O = FoEnJAH =n@ = J=C HAFHAIAnJEnC JDA
JOFA. .oH = CELAn EmFlAmAnJ=JEon JDA FolOmoHFDE? JOFA D=I JDA I=mA IEzA =I JDA BolloM­
EnC=CCHAC=JA@ABEnEJEon:
aggr Polytype
{
void* ptr;
int tag;
};

6DA void JOFA FAHBoHmI JDA IFA?E=l J=Ik oB @A?l=HEnC FHo?A@KHAI HAJKHnEnC no L=lKA
=n@ =I F=HJ oB = @AHELA@ JOFA Jo BoHm CAnAHE? FoEnJAHI. 6DA void JOFA m=O noJ >A KIA@
=I=>=IE?JOFA.

3.2. Derived types


6OFAI =HA @AHELA@ En JDA I=mA M=O =I En +. OFAH=JoHI =FFlEA@ En @A?l=H=JEonI KIA
onAoBJDA>=IE?JOFAIJo@AHELA=nAMJOFA.6DA@AHELEnCoFAH=JoHI=HA:
* ?HA=JA = FoEnJAH Jo
& OEAl@ JDA =@@HAII oB
() = BKn?JEon HAJKHnEnC
[] =n =HH=O oB

6DAIA oFAH=JoHI >En@ Jo JDA n=mA oB A=?D E@AnJEBEAH En = @A?l=H=JEon oH @ABEnEJEon. 5omA
AN=mFlAI=HA:
int *ptr; /* A pointer to an integer */
byte c[10]; /* A vector of 10 bytes */
float *pow(); /* A function returning a pointer to float */

+omFlAN JOFAI m=O >A >KElJ BHom JDA >=IE? JOFAI =n@ JDA @AHELEnC oFAH=JoHI. +omFlAN
JOFAI m=O >A AEJDAH =CCHAC=JAI, KnEonI, JKFlAI, oH =>IJH=?J @=J= JOFAI ),6. 6DAIA
?omFlAN JOFAI ?onJ=En IAGKAn?AI oB >=IE? JOFAI =n@ oJDAH @AHELA@ JOFAI. )n =CCHAC=JA
EI = IEmFlA ?ollA?JEon oB >=IE? =n@ @AHELA@ JOFAI. -=?D AlAmAnJ oB JDA =CCHAC=JA D=I
KnEGKA IJoH=CA. )n =>IJH=?J @=J= JOFA D=I JDA I=mA IJoH=CA =llo?=JEon =I =n =CCHAC=JA
>KJ =lIo D=I = IAJ oB BKn?JEonI Jo m=nEFKl=JA JDA JOFA, =n@ = IAJ oB FHoJA?JEon =JJHE>KJAI
BoH A=?D oB EJI mAm>AHI. ) KnEon JOFA ?onJ=EnI = IAGKAn?A oB >=IE? =n@ @AHELA@ JOFAI
JD=J o??KFO JDA I=mA IJoH=CA. 6DA IEzA oB = KnEon EI @AJAHmEnA@ >O JDA IEzA oB JDA l=HC­
AIJmAm>AH.
­$­

6DA @A?l=H=JEon oB ?omFlAN JOFAI EnJHo@K?AI typenames EnJo JDA l=nCK=CA. )BJAH
@A?l=H=JEon = JOFAn=mA ?=n >A KIA@ MDAHALAH = >=IE? JOFA EI FAHmEJJA@. NAM typenames
m=O>A@ABEnA@BHom@AHELA@=n@>=IE?JOFAIKIEnCJDA typedef IJ=JAmAnJ.
6DA EnJACH=l JOFAI =HA int, uint, sint, usint, byte, lint =n@ ulint. 6DA
=HEJDmAJE? JOFAI =HA JDA EnJACH=l JOFAI =n@ JDA JOFA float. 6DA FoEnJAH JOFA EI = JOFA
@AHELA@ BHom JDA & =@@HAII oB oFAH=JoH oH @AHELA@ BHom = FoEnJAH @A?l=H=JEon. 6DA
?omFlANJOFAI=HA aggr, adt,=n@ union.

3.3. Conversions and Promotions


)lAB FAHBoHmI JDA I=mA EmFlE?EJ ?onLAHIEonI =n@ FHomoJEonI =I )N51 + MEJD JDA
=@@EJEon oB ?omFlAN JOFA FHomoJEon: Kn@AH =IIECnmAnJ, BKn?JEon F=H=mAJAH AL=lK=JEon,
oH BKn?JEon HAJKHnI, )lAB MEll FHomoJA =n Knn=mA@ mAm>AH oB = ?omFlAN JOFA EnJo JDA
JOFAoBJDAlABJ-D=n@IE@A,BoHm=lF=H=mAJAH,oHBKn?JEon.

4. Declarations
) @A?l=H=JEon =JJ=?DAI = JOFA Jo =n E@AnJEBEAH; EJ nAA@ noJ HAIAHLA IJoH=CA. ) @A?l=­
H=JEon MDE?D HAIAHLAI IJoH=CA EI ?=llA@ = @ABEnEJEon. ) FHoCH=m ?onIEIJI oB = lEIJ oB @A?l=­
H=JEonI:
program:
declaration−list

declaration−list:
declaration
declaration−list declaration
) @A?l=H=JEon ?=n @ABEnA = IEmFlA L=HE=>lA, = BKn?JEon, = FHoJoJOFA Jo = BKn?JEon, =n ),6
BKn?JEon,=JOFAIFA?EBE?=JEon,oH=JOFA@ABEnEJEon:
declaration:
simple−declarations
type−declaration
function−declaration
type−definition

4.1. Simple declarations


) IEmFlA @A?l=H=JEon ?onIEIJI oB = JOFA IFA?EBEAH =n@ = lEIJ oB E@AnJEBEAHI. -=?D E@An­
JEBEAH m=O >A GK=lEBEA@ >O @AHELEnC oFAH=JoHI. 5EmFlA @A?l=H=JEonI =J JDA BElA I?oFA m=O
>AEnEJE=lEzA@.
­%­

simple−declarations:
type−specifier simple−decl−list ;

simple−decl−list:
simple−declaration
function−prototype
simple−decl−list , simple−declaration

function−prototype:
pointeropt identifier array−specopt ( arglist ) ;
( pointeropt identifier array−specopt ) ( arglist ) ;

simple−declaration:
pointeropt identifier array−specopt
pointeropt identifier array−specopt = initializer−list

pointer:
*
pointer *

array−spec:
[ constant−expression ]
[ constant−expression ] array−spec

4.2. Array Specifiers


6DA@EmAnIEonoB=n=HH=O mKIJ >A non-zAHo FoIEJELA ?onIJ=nJ. )HH=OI D=LA = loMAH
>oKn@ oB  =n@ =n KFFAH >oKn@ oB n−1, MDAHA n EI JDA L=lKA oB JDA ?onIJ=nJ ANFHAI­
IEon.

4.3. Type Specifiers

type−specifier:
scopeopt type

type:
byte
int
uint
sint
usint
lint
ulint
void
float
typename
polyname
tupletype
channel−specifier
­&­

scope:
intern
extern

channel−specifier:
chan ( typelist ) buffer−specopt

tupletype:
tupleopt ( typelist )

buffer−spec:
[ constant−expression ]

typelist:
ptr−type
ptr−type , typelist

ptr−type:
type−specifier
ptr−type pointeropt

polyname:
identifier

6DA kAOMoH@I intern =n@ extern ?onJHol JDA I?oFA oB @A?l=H=JEonI. 9DAn =FFlEA@
Jo = @ABEnEJEon oH @A?l=H=JEon =J JDA BElA I?oFA, intern n=HHoMIJDAI?oFAJoJDA?KHHAnJ
BElA; extern m=kAI JDA @A?l=HA@ E@AnJEBEAH LEIE>lA Jo oJDAH ?omFEl=JEon KnEJI. *O @AB=KlJ
@A?l=H=JEonI =J JDA BElA I?oFA @AB=KlJ Jo extern. 6DA ?onJHol oB =??AII Jo mAm>AHI oB
=>IJH=?J@=J=JOFAIEI@ABEnA@EnJDA@EI?KIIEonoB),6I>AloM.
Typename EI =n E@AnJEBEAH @ABEnA@ >O = ?omFlAN JOFA @A?l=H=JEon oH = typedef
IJ=JAmAnJ.

4.3.1. Channel Type Specification


6DA JOFA IFA?EBEA@ >O = chan @A?l=H=JEon EI =?JK=llO = FoEnJAH Jo =n EnJAHn=l o>jA?J
MEJD =n =nonOmoKI JOFA IFA?EBEAH. *A?=KIA oB JDAEH =nonOmEJO, o>jA?JI oB JDEI IFA?E=l
JOFA ?=nnoJ >A @ABEnA@ En @A?l=H=JEonI; EnIJA=@ JDAO mKIJ >A ?HA=JA@ >O =n alloc
IJ=JAmAnJ HABAHHEnC Jo = chan. ) ?D=nnAl @A?l=H=JEon MEJDoKJ = >KBBAH IFA?EBE?=JEon FHo­
@K?AI = IOn?DHonoKI ?ommKnE?=JEon ?D=nnAl. 6DHA=@I IAn@EnC L=lKAI on JDA ?D=nnAl
MEll >lo?k KnJEl IomA oJDAH JDHA=@ HA?AELAI BHom JDA ?D=nnAl. 6DA JMo JDHA=@I HAn­
@AzLoKI =n@ = L=lKA EI F=IIA@ >AJMAAn IAn@AH =n@ HA?AELAH. 1B >KBBAHI =HA IFA?EBEA@ JDAn
=n =IOn?DHonoKI ?D=nnAl EI FHo@K?A@. 6DA constant−expression @ABEnAI JDA nKm>AH oB
>KBBAHI Jo >A =llo?=JA@. ) IAn@ oFAH=JEon MEll ?omFlAJA EmmA@E=JAlO MDElA >KBBAHI =HA
=L=El=>lA, =n@MEll>lo?kEB=ll>KBBAHI=HAEnKIA.)HA?AELAoFAH=JEonMEll>lo?kEBnoL=lKA
EI >KBBAHA@. 1B = L=lKA EI >KBBAHA@, JDA HA?AELA MEll ?omFlAJA =n@ m=kA JDA >KBBAH =L=El­
=>lA BoH = nAM IAn@ oFAH=JEon. )nO IAn@AHI M=EJEnC BoH >KBBAHI MEll JDAn >A =lloMA@ Jo
?onJEnKA.
8=lKAIoB chan−type =HAF=IIA@ >AJMAAn JDHA=@I KIEnC JDA ?D=nnAl BoH ?ommKnE?=­
JEon. 1B chan−type EI = ?omm=-IAF=H=JA@ lEIJ oB JOFAI JDA ?D=nnAl IKFFlEAI = variant FHo­
Jo?ol. ) L=HE=nJ FHoJo?ol =lloMI mAII=CAI Jo >A @AmKlJEFlANA@ >O JOFA @KHEnC = HA?AELA
oFAH=JEon. ) BoHm oB JDA alt IJ=JAmAnJ =lloMI JDA ?onJHol BloM Jo >A mo@EBEA@ >=IA@
onJDAJOFAoB=L=lKAHA?AELA@BHom=?D=nnAlIKFFlOEnC=L=HE=nJFHoJo?ol.
­'­

4.3.2. Polymorphic Type


6DA FolOmoHFDE? JOFA ?=n >A KIA@ Jo @On=mE?=llO HAFHAIAnJ = L=lKA oB =nO JOFA. )
FolOmoHFDE? JOFA EI E@AnJEBEA@ >O = lANE?=l n=mA @ABEnA@ En = FolOmoHFDE? JOFA @ABEnEJEon
IAA JDA IA?JEon on 6OFA ,ABEnEJEon oH =I = F=H=mAJAH Jo = FolOmoHFDE? =>IJH=?J @=J=
JOFA IAA JDA IA?JEon on 2olOmoHFDE? =n@ 2=H=mAJAHEzA@ )>IJH=?J ,=J= 6OFAI. ,EIJEn?J
lANE?=l n=mAI HAFHAIAnJ = L=lKA oB JDA I=mA IJHK?JKHA >KJ =HA @EBBAHAnJ BoH JDA FKHFoIAI
oB JOFA ?DA?kEnC. ) FolOmoHFDE? L=lKA EI HAFHAIAnJA@ >O = fat pointer. 6DA FoEnJAH ?on­
IEIJI oB =n integer J=C =n@ = pointer Jo = L=lKA. LEkA ?D=nnAlI, IJoH=CA BoH JDA @=J= mKIJ
>A=llo?=JA@>OJDAHKnJEmA.

4.4. Initializers
OnlOIEmFlA@A?l=H=JEonI=JJDABElAI?oFAm=O>AEnEJE=lEzA@.
initializer−list:
constant−expression
[ constant−expression ] constant−expression
{ initializer−list }
initializer−list , initializer−list
)n EnEJE=lEz=JEon ?onIEIJI oB = constant−expression oH = lEIJ oB ?onIJ=nJ-ANFHAIIEonI IAF­
=H=JA@ >O ?omm=I =n@ An?loIA@ >O >H=?AI. )n =HH=O oH ?omFlAN JOFA HAGKEHAI =n
ANFlE?EJ IAJ oB >H=?AI BoH A=?D lALAl oB nAIJEnC. 7nEonI m=O noJ >A EnEJE=lEzA@. )ll JDA
?omFonAnJI oB = L=HE=>lA nAA@ noJ >A ANFlE?EJlO EnEJE=lEzA@; KnEnEJE=lEzA@ AlAmAnJI =HA IAJ
Jo zAHo. ),6 JOFAI =HA EnEJE=lEzA@ En JDA I=mA M=O =I =CCHAC=JAI MEJD JDA AN?AFJEon oB
),6 BKn?JEon mAm>AHI MDE?D =HA ECnoHA@ BoH JDA FKHFoIAI oB EnEJE=lEz=JEon. -lAmAnJI oB
IF=HIA =HH=OI ?=n >A EnEJE=lEzA@ >O IKFFlOEnC = >H=?kAJA@ En@AN BoH =n AlAmAnJ. 5K??AI­
IELA AlAmAnJI MEJDoKJ JDA En@AN noJ=JEon ?onJEnKA Jo EnEJE=lEzA JDA =HH=O En IAGKAn?A. .oH
AN=mFlA:
byte a[256] = {
[’a’] ’A’, /* Set element 97 to 65 */
[’a’+1] ’B’, /* Set element 98 to 66 */
’C’ /* Set element 99 to 67 */
};

1B JDA @EmAnIEonI oB JDA =HH=O =HA omEJJA@ BHom JDA array−spec JDA ?omFElAH IAJI JDA
IEzA oB A=?D @EmAnIEon Jo >A l=HCA AnoKCD Jo =??ommo@=JA JDA EnEJE=lEz=JEon. 6DA IEzA
oBJDA=HH=OEn>OJAI?=n>ABoKn@KIEnC sizeof.

4.5. Type Declarations


)JOFA@A?l=H=JEon?HA=JAI = nAM JOFA =n@ EnJHo@K?AI =n E@AnJEBEAH HAFHAIAnJEnC JD=J
JOFAEnJoJDAl=nCK=CA.
type−declaration:
complex { memberlist } ;
enumeration−type
tupletype

complex:
adt typename poly−specopt
aggr typename
union typename

poly−spec:
[ typelist ]
) ?omFlAN JOFA EI ?omFoIA@ oB = lEIJ oB mAm>AHI. -=?D mAm>AH m=O >A = ?omFlAN
­­

JOFA, = @AHELA@ JOFA oH = >=IE? JOFA. MAm>AHI =HA HABAHAn?A@ >O J=C oH >O JOFA. MAm­
>AHI MEJDoKJ J=CI =HA ?=llA@ unnamed. )HEJDmAJE? JOFAI, ?D=nnAl JOFAI, JKFlAI, =n@
?omFlAN JOFAI m=O >A Knn=mA@. ,AHELA@ JOFAI m=O noJ >A lABJ Knn=mA@. +omFlAN
Knn=mA@ mAm>AHI =HA HABAHAn?A@ >O JOFA oH >O EmFlE?EJ FHomoJEon @KHEnC =IIECnmAnJ
oH MDAn IKFFlEA@ =I BKn?JEon =HCKmAnJI. OJDAH Knn=mA@ mAm>AHI =llo?=JA IJoH=CA >KJ
m=O noJ >A HABAHAn?A@. +omFlAN JOFAI =HA ?omF=HA@ >O IJHK?JKH=l H=JDAH JD=n n=mA
AGKEL=lAn?A. )JOFA@A?l=H=JEonmKIJD=LAAEJDAH=JOFAn=mAoH=J=C.
memberlist:
member
memberlist member

member:
type ;
tname pointeropt decl−tag array−specopt ;
tname decl−tag ( arglist ) ;

decl−tag:
identifier
tname EI onA oB JDA >=IE? JOFAI oH = nAM JOFA EnJHo@K?A@ >O aggr, adt, union, oH
typedef.

4.6. Tuples
) tuple EI = ?ollA?JEon oB JOFAI BoHmEnC = IEnClA o>jA?J MDE?D ?=n >A KIA@ En JDA
Fl=?A oB =n Knn=mA@ ?omFlAN JOFA. 6DA En@ELE@K=l mAm>AHI oB = JKFlA ?=n onlO >A
=??AIIA@>O=IIECnmAnJ.
tuple:
( tlist )

tlist:
tlist , expression
9DAn JDA @A?l=H=JEon oB = JKFlA MoKl@ >A =m>ECKoKI >A?=KIA oB JDA F=HAnJDAIEI BoH
EnIJ=n?AEnJDA@A?l=H=JEonoB=n=KJom=JE?L=HE=>lAKIAJDAkAOMoH@ tuple:
void
f()
{
int a;
tuple (int, byte, Rectangle) b;
int c;
}

6OFA ?DA?kEnC oB JKFlA ANFHAIIEonI EI FAHBoHmA@ >O m=J?DEnC JDA shape oB A=?D oB JDA
?omFonAnJ JOFAI. 6KFlAI m=O onlO >A =@@HAIIA@ >O =IIECnmAnJ EnJo oJDAH ?omFlAN
JOFAI oH l-L=lKA@ JKFlA ANFHAIIEonI. ) >H=?kAJA@ lEIJ oB ANFHAIIEonI BoHmI = JKFlA ?on­
IJHK?JoH, MDElA = lEIJ oB l-L=lKA@ ANFHAIIEonI on JDA lABJ D=n@ IE@A BoHmI = @AIJHK?JoH.
.oHAN=mFlA,Jom=kA=BKn?JEonHAJKHnmKlJEFlAL=lKAI:
­­

(int, byte*, byte)


func()
{
return (10, "hello", ’c’);
}

void
main()
{
int a;
byte* str;
byte c;
(a, str, c) = func();
}

9DAn=JKFlA=FFA=HI=IJDA lABJ-D=n@ IE@A oB =n =IIECnmAnJ, JOFA ?DA?kEnC FHo?AA@I =I


EB A=?D En@ELE@K=l mAm>AH oB JDA JKFlA MAHA =n =IIECnmAnJ IJ=JAmAnJ Jo JDA ?oHHAIFon@­
EnC mAm>AH oB JDA ?omFlAN JOFA on JDA HECDJ-D=n@ IE@A. 1B = JKFlA =FFA=HI on JDA HECDJ
D=n@ IE@A oB =n =IIECnmAnJ MDAHA JDA lABJ-D=n@ IE@A OEAl@I = ?omFlAN JOFA JDAn JDA
JOFAIoBA=?DEn@ELE@K=lmAm>AHoBJDAJKFlAmKIJm=J?D JDA ?oHHAIFon@EnC JOFAI oB JDA
?omFlAN JOFA AN=?JlO. 1B = JKFlA EI ?=IJ EnJo = ?omFlAN JOFA JDAn A=?D mAm>AH oB JDA
JKFlA MEll >A ?onLAHJA@ EnJo JDA JOFA oB JDA ?oHHAIFon@EnC mAm>AH oB JDA ?omFlAN JOFA
Kn@AHJDAHKlAIoB=IIECnmAnJ.
aggr X
{
int a;
byte b;
};

void
main()
{
X x;
byte c;

x = (10, c); /* Members match exactly */


x = (X)(10, 1.5); /* float is converted to byte */
}

4.7. Abstract Data Types


)n =>IJH=?J @=J= JOFA ),6 @ABEnAI >oJD IJoH=CA BoH mAm>AHI, =I En =n =CCHAC=JA,
=n@ JDA oFAH=JEonI JD=J ?=n >A FAHBoHmA@ on JD=J JOFA. )??AII Jo JDA mAm>AHI oB =n
=>IJH=?J @=J= JOFA EI HAIJHE?JA@ Jo An=>lA EnBoHm=JEon DE@EnC. 6DA I?oFA oB JDA mAm>AHI
oB =n =>IJH=?J @=J= JOFA @AFAn@I onJDAEHJOFA.*O@AB=KlJ=??AIIJomAm>AHIJD=J@ABEnA
@=J= EI lEmEJA@ Jo JDA mAm>AH BKn?JEonI. MAm>AHI ?=n >A ANFlE?EJlO ANFoHJA@ BHom JDA
JOFA KIEnC JDA extern IJoH=CA ?l=II En JDA mAm>AH @A?l=H=JEon. MAm>AH BKn?JEonI =HA
LEIE>lA >O @AB=KlJ, JDA oFFoIEJA >AD=LEoH oB @=J= mAm>AHI. )??AII Jo = mAm>AH BKn?JEon
m=O >A HAIJHE?JA@ Jo oJDAH mAm>AH BKn?JEonI >O GK=lEBOEnC JDA @A?l=H=JEon MEJD JDA
intern IJoH=CA?l=II. 6DABoKH?om>En=JEonI=HA:
­ ­

adt Point
{
int x; /* Access only by member fns */
extern int y; /* by everybody */

Point set(Point*); /* by everybody */


intern Point tst(Point); /* only by member fns */
};

MAm>AH BKn?JEonI =HA @ABEnA@ >O JOFA =n@ n=mA. 6DA F=EH BoHmI = KnEGKA n=mA BoH JDA
BKn?JEon, Io JDA I=mA mAm>AH BKn?JEon n=mA ?=n >A KIA@ En m=nO JOFAI. 7IEnC JDA l=IJ
AN=mFlA,JDAmAm>AHBKn?JEon set ?oKl@>A@ABEnA@=I:
Point
Point.set(Point *a)
{
a−>x = 0; /* Set Point value to zero */
a−>y = 0;

return *a;
}

)n EmFlE?EJ =HCKmAnJ oB AEJDAH = FoEnJAH Jo JDA ),6 oH JDA L=lKA oB JDA ),6 m=O >A
F=IIA@ Jo = mAm>AH BKn?JEon. 1B JDA BEHIJ =HCKmAnJ oB JDA mAm>AH BKn?JEon @A?l=H=JEon
En JDA ),6 IFA?EBE?=JEon EI * typename MEJD JDA * FHA?A@EnC JDA n=mA, JDAn = pointer
Jo JDA ),6 EI =KJom=JE?=llO F=IIA@ =I JDA BEHIJ F=H=mAJAH, IEmEl=HlO Jo JDA self ?on­
IJHK?J En 5m=llJ=lk. 1B JDA @A?l=H=JEon EI oB JDA BoHm . typename JDAn JDA value oB JDA
),6MEll>AF=IIA@JoJDAmAm>AHBKn?JEon.
adt Point
{
int x;
extern int y;

/* Pass &Point as 1st arg */


Point set(*Point);
/* Pass Point as 1st arg */
Point clr(.Point);
intern Point tst(Point);
};

void
func()
{
Point p;

p.set(); /* Set receives &p as 1st arg */


}

6DAHA?AELEnCBKn?JEonEI@ABEnA@=I:
Point
Point.set(Point *p)
{
...
}
­!­

4.8. Polymorphic and Parameterized Abstract Data Types


)lAB =lloMI JDA ?onIJHK?JEon oB JOFA F=H=mAJAHEzA@ =>IJH=?J @=J= JOFAI, IEmEl=H Jo
generic =>IJH=?J @=J= JOFAI En )@= =n@ -EBBAl. )n ),6 EI F=H=mAJAHEzA@ >O IKFFlOEnC
JOFA F=H=mAJAH n=mAI En JDA @A?l=H=JEon. 6DA JOFA F=H=mAJAHI m=O >A KIA@ Jo IFA?EBO
JDA JOFAI oB mAm>AHI oB JDA ),6. 6DA =HCKmAnJ JOFA n=mAI D=LA JDA I=mA ABBA?J =I =
typedef Jo JDA FolOmoHFDE? JOFA. 6DA I?oFA oB JDA JOFAI IKFFlEA@ =I =HCKmAnJI EI JDA
I=mA =I JDA ),6 typename =n@ ?=n JDAHABoHA >A KIA@ =I = JOFA IFA?EBEAH En IEmFlA @A?­
l=H=JEonI. .oH AN=mFlA JDA @ABEnEJEon oB = IJ=?k JOFA oB F=H=mAJAH JOFA T m=O >A
@ABEnA@=I:
adt Stack[T]
{
int tos;
T data[100];
void push(*Stack, T);
T pop(*Stack);
};

MAm>AH BKn?JEonI oB Stack =HA MHEJJAn En JAHmI oB JDA F=H=mAJAH JOFA T. 6DA EmFlA­
mAnJ=JEonoB push mECDJ>A:
void
Stack.push(Stack *s, T v)
{
s−>data[s−>tos++] = v;
}

6DA Stack JOFA ?=n >A EnIJ=nJE=JA@ En JMo BoHmI. 1n JDA bound BoHm, = JOFA EI IFA?EBEA@
BoH T. 6DA FHoCH=m EI JOFA ?DA?kA@ =I EB JDA IKFFlEA@ JOFA MAHA IK>IJEJKJA@ BoH T En JDA
),6@A?l=H=JEon..oHAN=mFlA:
Stack[int] stack;

@A?l=HAI = IJ=?k MDAHA A=?D AlAmAnJ EI =n int. 1n JDA >oKn@ BoHm = JOFA mKIJ >A IKF­
FlEA@ BoH A=?D F=H=mAJAH JOFA. 1n JDA unbound BoHm no F=H=mAJAH JOFAI =HA IFA?EBEA@.
6DEI=lloMIL=lKAIoB=nOJOFAJo>AIJoHA@EnJDAIJ=?k..oHAN=mFlA:
Stack poly;

@A?l=HAI=IJ=?kMDAHAA=?DAlAmAnJD=IFolOmoHFDE?JOFA.

4.9. Enumeration Types

enumeration−type:
enum typename { enum−list } ;

enum−list:
identifier
identifier = constant−expression
enum−list , enum−list
-nKmAH=JEonI =HA JOFAI MDoIA L=lKA EI lEmEJA@ Jo = IAJ oB EnJACAH ?onIJ=nJI. 6DAIA ?on­
IJ=nJI, JDA mAm>AHI oB JDA AnKmAH=JEon, =HA ?=llA@ AnKmAH=JoHI. -nKmAH=JEon L=HE=>lAI
=HA AGKEL=lAnJ Jo EnJACAH L=HE=>lAI. -nKmAH=JoHI m=O =FFA=H MDAHALAH =n EnJACAH ?on­
IJ=nJ EI lAC=l. 1B JDA L=lKAI oB JDA AnKmAH=JoHI =HA noJ @ABEnA@ ANFlE?EJlO, JDA ?omFElAH
=IIECnI En?HAmAnJEnC L=lKAI IJ=HJEnC BHom . 1B = L=lKA EI CELAn Jo =n AnKmAH=JoH, L=lKAI
=HA =IIECnA@ Jo JDABolloMEnCAnKmAH=JoHI>OEn?HAmAnJEnCJDAL=lKABoHA=?DIK??AIIELA
mAm>AHKnJElJDAnANJ=IIECnA@L=lKAEIHA=?DA@.
­"­

4.10. Type Definition


6OFA @ABEnEJEon =lloMI @AHELA@ JOFAI Jo >A n=mA@, >=IE? JOFAI Jo >A HAn=mA@, FolO­
moHFDE?JOFAIJo>An=mA@,=n@BoHM=H@HABAHAn?EnC>AJMAAn?omFlANJOFAI.
type−definition:
typedef tname identifier ;
typedef polyname ;
1B tname EI omEJJA@ JDAn JDA E@AnJEBEAH, polyname, >A?omAI = FolOmoHFDE? JOFA IFA?EBEAH.
6o @A?l=HA ?omFlAN JOFAI MEJD mKJK=llO @AFAn@AnJ FoEnJAHI, EJ EI nA?AII=HO Jo KIA =
typedef JoFHA@ABEnAonAoBJDA JOFAI. )lAB @oAI noJ FAHmEJ mKJK=llO @AFAn@AnJ ?om­
FlANJOFAI,onlOHABAHAn?AI>AJMAAnJDAm..oHAN=mFlA:
typedef aggr A;

aggr B
{
A *aptr;
B *bptr;
};

aggr A
{
A *aptr;
B *bptr;
};

4.11. Function Declarations


6DAHA =HA JDHAA BoHmI oB BKn?JEon @A?l=H=JEon: BKn?JEon @ABEnEJEon, FHoJoJOFA @A?l=­
H=JEon,=n@BKn?JEonFoEnJAH@A?l=H=JEon.
function−declaration:
type−specifier identifier ( arglist ) block

function−id:
pointeropt identifier array−specopt
adt−function

adt−function:
typename . decl−tag

arglist:
arg
pointer type
arglist , arg

arg:
type
type pointer
type ( pointer ) ( arglist )
type simple−declaration
...
1B = BoHm=l F=H=mAJAH EI @A?l=HA@ MEJDoKJ =n E@AnJEBEAH, no L=HE=>lA ?oHHAIFon@EnC Jo JDA
=?JK=lF=H=mAJAHEIFHo@K?A@.
­#­

5. Expressions
6DA oH@AH oB ANFHAIIEon AL=lK=JEon EI noJ @ABEnA@ AN?AFJ MDAHA noJA@. 6D=J EI,
KnlAII JDA @ABEnEJEon oB JDA oFAH=JoH CK=H=nJAAI AL=lK=JEon oH@AH, =n oFAH=JoH m=O AL=l­
K=JA=nOoBEJIoFAH=n@IBEHIJ.
6DA >AD=LEoH oB AN?AFJEon=l ?on@EJEonI IK?D =I @ELE@A >O zAHo, =HEJDmAJE? oLAHBloM,
=n@Blo=JEnCFoEnJAN?AFJEonIEInoJ@ABEnA@.

5.1. Pointer Generation


4ABAHAn?AI Jo ANFHAIIEonI oB JOFA BKn?JEon HAJKHnEnC 6 =n@ =HH=O oB 6 =HA HAMHEJ­
JAn Jo FHo@K?A FoEnJAHI Jo AEJDAH JDA BKn?JEon oH JDA BEHIJ AlAmAnJ oB JDA =HH=O. 6D=J EI
BKn?JEon HAJKHnEnC 6 >A?omAI FoEnJAH Jo BKn?JEon HAJKHnEnC 6 =n@ =HH=O oB 6
>A?omAIFoEnJAHJoJDABEHIJAlAmAnJoB=HH=OoB6.

5.2. Primary Expressions


2HEm=HOANFHAIIEonI=HAE@AnJEBEAHI,?onIJ=nJI,oHF=HAnJDAIEzA@ANFHAIIEonI:
primary−expression:
identifier
constant
...
nil
( expression )
tuple
6DA F=H=mAJAHI HA?AELA@ >O = BKn?JEon J=kEnC L=HE=>lA =HCKmAnJI =HA HABAHAn?A@ KIEnC
JDA AllEFIEI .... 6DA FHEm=HO-ANFHAIIEon ... OEAl@I = L=lKA oB JOFA FoEnJAH Jo LoE@.
6DA L=lKA FoEnJI =J JDA BEHIJ lo?=JEon =BJAH JDA BoHm=l F=H=mAJAHI. 6DA FHEm=HO-
ANFHAIIEon nil HAJKHnI = FoEnJAH oB JOFA FoEnJAH Jo LoE@ oB L=lKA  MDE?D EI CK=H=n­
JAA@noJJoFoEnJ=J=no>jA?J. nil m=O=lIo>AKIA@JoEnEJE=lEzA?D=nnAlI=n@ FolOmoH­
FDE? JOFAI Jo = knoMn L=lKA. 6DA onlO lAC=l oFAH=JEon on JDAIA JOFAI =BJAH IK?D =n
=IIECnmAnJEI=JAIJMEJDonAoBJDAAGK=lEJOJAIJoFAH=JoHI=n@JDA nil L=lKA.

5.3. Postfix Expressions


postfix−expression:
primary−expression
postfix−expression [ expression ]
postfix−expression ( argument−list )
. typename . tag ( argument−list )
postfix−expression . tag
postfix−expression −> tag
postfix−expression ++
postfix−expression −−
postfix−expression ?

tag:
typename
identifier

argument−list:
expression
argument−list , expression
­$­

5.3.1. Array Reference


) FHEm=HO ANFHAIIEon BolloMA@ >O =n ANFHAIIEon An?loIA@ En IGK=HA >H=?kAJI EI =n
=HH=O En@ANEnC oFAH=JEon. 6DA ANFHAIIEon EI HAMHEJJAn Jo >A *((postfix−
expression)+(expression)). OnA oB JDA ANFHAIIEonI mKIJ >A oB JOFA FoEnJAH, JDA oJDAH
oBEnJACH=lJOFA.

5.3.2. Function Calls


6DA postfix−expression mKIJ OEAl@ = L=lKA oB JOFA FoEnJAH Jo BKn?JEon. ) JOFA @A?­
l=H=JEon BoH JDA BKn?JEon mKIJ >A @A?l=HA@ FHEoH Jo=BKn?JEon?=ll.6DA@A?l=H=JEon?=n>A
AEJDAH JDA @ABEnEJEon oB JDA BKn?JEon oH = BKn?JEon FHoJoJOFA. 6DA JOFAI oB A=?D =HCK­
mAnJ En JDA FHoJoJOFA mKIJ m=J?D JDA ?oHHAIFon@EnC ANFHAIIEon JOFA Kn@AH JDA HKlAI oB
FHomoJEon=n@?onLAHIEonBoH =IIECnmAnJ. 1n =@@EJEon Knn=mA@ ?omFlAN JOFA mAm>AHI
MEll>AFHomoJA@=KJom=JE?=llO. .oHAN=mFlA:
aggr Test
{
int t;
Lock; /* Unnamed substructure */
};

Test yuk; /* Definition of complex object yuk */


void lock(Lock*); /* Prototype for function lock */

void
main()
{
lock(&yuk); /* address of yuk.Lock is passed */
}

+=llI Jo mAm>AH BKn?JEonI m=O KIA JDA JOFA n=mA EnIJA=@ oB =n ANFHAIIEon Jo
E@AnJEBO JDA ),6. 1B JDA BKn?JEon D=I =n EmFlE?EJ BEHIJ F=H=mAJAH, nil EI F=IIA@. /ELAn
JDABolloMEnC@ABEnEJEonoB X JDAIAJMo?=llI=HAAGKEL=lAnJ:
adt X
{
int i;
void f(*X);
};

X val;

((X*)nil)−>f();
.X.f();

6DEI BoHm EI EllAC=l EB JDA EmFlE?EJ F=H=mAJAH EI @A?l=HA@ >O L=lKA H=JDAH JD=n >O HABAH­
An?A.
+=llI Jo mAm>AH BKn?JEonI oB FolOmoHFDE? ),6I D=LA IFA?E=l FHomoJEon HKlAI BoH
BKn?JEon =HCKmAnJI. 1B = FolOmoHFDE? JOFA P D=I >AAn >oKn@ Jo =n =?JK=l JOFA T JDAn =n
=?JK=l F=H=mAJAH v oB JOFA T ?oHHAIFon@EnC Jo = BoHm=l F=H=mAJAH oB JOFA P MEll >A FHo­
moJA@ EnJo JOFA P =KJom=JE?=llO. 6DA FHomoJEon EI AGKEL=lAnJ Jo (alloc P)v =I
@AI?HE>A@EnJDA+=IJIIA?JEon..oHAN=mFlA:
­%­

adt X[T]
{
void f(*X, T);
};

X[int] bound;

bound.f(3); /* 3 is promoted as if (alloc T)3 */


bound.f((alloc T)3); /* illegal: int not same as poly */

1nJDAKn>oKn@?=IAL=lKAImKIJ>AANFlE?EJlO?onLAHJA@ EnJo JDA FolOmoHFDE? JOFA KIEnC


JDA?=IJIOnJ=N:
X unbound;

unbound.f((alloc T)3); /* 3 is converted into poly */


unbound.f(3); /* illegal: int not same as poly */

1n AEJDAH ?=IA JDA =?JK=l F=H=mAJAH mKIJ D=LA JDA I=mA JOFA =I JDA BoHm=l F=H=mAJAH
=BJAH=nO>En@EnCD=IJ=kAnFl=?A.

5.3.3. Complex Type References


6DA oFAH=JoH . HABAHAn?AI = mAm>AH oB = ?omFlAN JOFA. 6DA BEHIJ F=HJ oB JDA
ANFHAIIEon mKIJ OEAl@ union, aggr, oH adt. N=mA@ mAm>AHI mKIJ >A IFA?EBEA@ >O
n=mA,Knn=mA@mAm>AHI>OJOFA. OnlOonAKnn=mA@mAm>AHoBJOFA typename EI FAH­
mEJJA@ En JDA ?omFlAN JOFA MDAn HABAHAn?EnC mAm>AHI >O JOFA, oJDAHMEIA JDA HABAHAn?A
MoKl@ >A =m>ECKoKI. 1B JDA HABAHAn?A EI >O typename =n@ no mAm>AHI oB typename
ANEIJ En JDA ?omFlAN, Knn=mA@ IK>IJHK?JKHAI MEll >A IA=H?DA@ >HA=@JD BEHIJ. 6DA oFAH=­
JEon −> KIAI = FoEnJAH Jo HABAHAn?A = ?omFlAN JOFA mAm>AH. 6DA −> oFAH=JoH BolloMI
JDA I=mA IA=H?D =n@ JOFA HKlAI =I . =n@ EI AGKEL=lAnJ Jo JDA ANFHAIIEon (*postfix−
expression).tag.
4ABAHAn?AI Jo FolOmoHFDE? mAm>AHI oB Kn>oKn@ FolOmoHFDE? ),6I >AD=LA =I
noHm=l mAm>AHI: JDAO OEAl@ =n Kn>oKn@ FolOmoHFDE? JOFA. *oKn@ FolOmoHFDE? ),6I
D=LA IFA?E=l HKlAI. +onIE@AH = FolOmoHFDE? JOFA P JD=J EI >oKn@ Jo =n =?JK=l JOFA T. 1B =
HABAHAn?A Jo = mAm>AH oH BKn?JEon HAJKHn L=lKA oB JOFA P EI =IIECnA@ Jo = L=HE=>lA v oB
JOFA T KIEnC JDA =IIECnmAnJ oFAH=JoH =, JDAn JDA JOFA oB P MEll >A n=HHoMA@ Jo T,
=IIECnA@ Jo v, =n@ JDA IJoH=CA KIA@ >O JDA FolOmoHFDE? L=lKA MEll >A Kn=llo?=JA@. 6DA
L=lKA =IIECnmAnJ oFAH=JoH := FAHBoHmI JDA I=mA JOFA n=HHoMEnC >KJ @oAI noJ Kn=llo­
?=JAJDAIJoH=CAKIA@>OJDAFolOmoHFDE?L=lKA..oHAN=mFlA:
adt Stack[T]
{
int tos;
T data[100];
};

Stack[int] s;
int i, j, k;

i := s.data[s−>tos];
j = s.data[s−>tos];
k = s.data[s−>tos]; /* illegal */

6DA BEHIJ =IIECnmAnJ ?oFEAI JDA L=lKA =J JDA JoF oB JDA IJ=?k EnJo i MEJDoKJ =lJAHEnC JDA
@=J= IJHK?JKHA. 6DA IA?on@ =IIECnmAnJ moLAI JDA L=lKA EnJo j =n@ Kn=llo?=JAI JDA IJoH­
=CA KIA@ En JDA IJ=?k @=J= IJHK?JKHA. 6DA JDEH@ =IIECnmAnJ EI EllAC=l IEn?A
data[s−>tos] D=I>AAnKn=llo?=JA@.
­&­

5.3.4. Postfix Increment and Decrement


6DA FoIJBEN En?HAmAnJ  ++  =n@ @A?HAmAnJ  −−  oFAH=JoHI HAJKHn JDA L=lKA oB
expression,JDAnEn?HAmAnJEJoH@A?HAmAnJEJ>O.6DAANFHAIIEonmKIJ>A=nl-L=lKAoB
EnJACH=loHFoEnJAHJOFA.

5.4. Unary Operators


6DAKn=HOoFAH=JoHI=HA:
unary−expression:
postfix−expression
<− unary−expression
++ unary−expression
−− unary−expression
unary−operator cast−expression
sizeof cast−expression
zerox unary−expression

unary−operator: one of
? * !
+ − ~

5.5. Prefix Increment and Decrement


6DA FHABEN En?HAmAnJ  ++  =n@ FHABEN @A?HAmAnJ  −−  oFAH=JoHI =@@ oH IK>JH=?J
onA Jo = unary−expression =n@ HAJKHn JDA nAM L=lKA. 6DA unary−expression mKIJ >A =n
l-L=lKAoBEnJACH=loHFoEnJAHJOFA.

5.6. Receive and Can Receive


6DA FHABEN oFAH=JoH <− HA?AELAI = L=lKA BHom = ?D=nnAl. 6DA unary−expression
mKIJ >A oB JOFA ?D=nnAl oB 6. 6DA JOFA oB JDA HAIKlJ MEll >A 6. ) FHo?AII oH J=Ik MEll
>lo?k KnJEl = L=lKA EI =L=El=>lA BHom JDA ?D=nnAl. 6DA FHABEN oFAH=JoH ? HAJKHnI  EB =
?D=nnAlD=I=L=lKA=L=El=>lABoHHA?AELA,oJDAHMEIA.

5.7. Send and Can send


6DA FoIJBEN oFAH=JoH <−, on JDA lABJ-D=n@ IE@A oB =n =IIECnmAnJ IAA JDA IA?JEon
?=llA@)IIECnmAnJ,IAn@I=L=lKAJo=?D=nnAl,BoHAN=mFlA:
chan(int) c;

c <−= 1; /* send 1 on channel c */

6DA FoIJBEN oFAH=JoH ? HAJKHnI  EB = JDHA=@ ?=n IAn@ on = ?D=nnAl MEJDoKJ >lo?kEnC, 
oJDAHMEIA.
6DA FHABEN oH FoIJBEN >lo?kEnC JAIJ oFAH=JoH ? EI onlO HAlE=>lA MDAn KIA@ on = ?D=n­
nAl ID=HA@ >AJMAAn J=IkI En = IEnClA FHo?AII. ) FHo?AII m=O >lo?k =BJAH = IK??AIIBKl ?
>A?=KIAJDAHAm=O>A=H=?A>AJMAAnFHo?AIIAI?omFAJEnCBoHJDAI=mA?D=nnAl.

5.8. Indirection
6DA Kn=HO oFAH=JoH * HAJHEALAI JDA L=lKA FoEnJA@ Jo >O EJI oFAH=n@. 6DA oFAH=n@
mKIJ>AoBJOFAFoEnJAHJo6. 6DAHAIKlJoBJDAEn@EHA?JEonEI=L=lKAoBJOFA6.
­'­

5.9. Unary Plus and Minus


7n=HO FlKI EI AGKEL=lAnJ Jo (0+(unary−expression)). 7n=HO mEnKI EI AGKEL=lAnJ
Jo (0−(unary−expression)). )n EnJACH=l oFAH=n@ Kn@AHCoAI EnJACH=l FHomoJEon. 6DA
HAIKlJD=IJDAJOFAoBJDAFHomoJA@oFAH=n@.

5.10. Bitwise Negate


6DA oFAH=JoH ~ FAHBoHmI = >EJMEIA nAC=JEon oB EJI oFAH=n@, MDE?D mKIJ >A oB EnJA­
CH=lJOFA.

5.11. Logical Negate


6DA oFAH=JoH ! FAHBoHmI loCE?=l nAC=JEon oB EJI oFAH=n@, MDE?D mKIJ oB =HEJDmAJE?
oH FoEnJAH JOFA. 1B JDA oFAH=n@ EI = FoEnJAH =n@ EJI L=lKA EI nil JDA HAIKlJ EI EnJACAH ,
oJDAHMEIA . 1B JDA oFAH=n@ EI =HEJDmAJE? =n@ JDA L=lKA EI  JDA HAIKlJ EI , oJDAHMEIA JDA
HAIKlJEI.

5.12. Zerox
6DA zerox oFAH=JoH m=O onlO >A =FFlEA@ Jo =n ANFHAIIEon oB FolOmoHFDE? JOFA.
6DA HAIKlJ oB zerox EI = nAM B=J FoEnJAH, MDE?D FoEnJI =J = ?oFO oB JDA HAIKlJ oB AL=lK=J­
EnC unary−expression. .oHAN=mFlA:
typedef Poly;
Poly a, b, c;

a = (alloc Poly)10;
b = a;
c = zerox a;

?=KIAI a =n@ b Jo FoEnJ Jo JDA I=mA IJoH=CA BoH JDA L=lKA  =n@ c Jo FoEnJ Jo @EIJEn?J
IJoH=CA?onJ=EnEnC=noJDAH?oFOoBJDAL=lKA.

5.13. Sizeof Operator


6DA sizeof oFAH=JoH OEAl@I JDA IEzA En >OJAI oB EJI oFAH=n@, MDE?D m=O >A =n
ANFHAIIEon oH JDAF=HAnJDAIEzA@n=mAoB=JOFA.6DAIEzAEI@AJAHmEnA@BHomJDAJOFAoB
JDA oFAH=n@, MDE?D EI noJ EJIAlB AL=lK=JA@. 6DA HAIKlJ EI = IECnA@ EnJACAH ?onIJ=nJ. 1B
sizeof EI =FFlEA@ Jo = IJHEnC ?onIJ=nJ JDA HAIKlJ EI JDA nKm>AH oB >OJAI HAGKEHA@ Jo
IJoHAJDAIJHEnCEn?lK@EnCEJIJAHmEn=JEnCN7L>OJAoHzAHoHKnA.

5.14. Casts
)?=IJ?onLAHJIJDAHAIKlJoB=nANFHAIIEonEnJo=nAMJOFA:
cast−expression:
unary−expression
( type−cast ) cast−expression
( alloc polyname ) cast−expression

type−cast:
type pointer
function−prototype
tuple tuple
) L=lKA oB =nO JOFA m=O >A ?onLAHJA@ EnJo = FolOmoHFDE? JOFA >O =@@EnC JDA kAOMoH@
alloc >ABoHA JDA FolOmoHFDE? JOFA n=mA. 6DEI D=I JDA ABBA?J oB =llo?=JEnC IJoH=CA BoH
JDA L=lKA, =IIECnEnC JDA L=lKA oB cast−expression EnJo JDA IJoH=CA, =n@ OEAl@EnC = B=J
FoEnJAH =I JDA HAIKlJ. .oH AN=mFlA, Jo ?HA=JA = FolOmoHFDE? L=HE=>lA MEJD EnJACAH L=lKA
:
­ ­

typedef Poly;
Poly p;

p = (alloc Poly) 10;

6DA onlO oJDAH lAC=l ?=IJ EnLolLEnC = FolOmoHFDE? JOFA ?onLAHJI onA polyname EnJo
=noJDAH.

5.15. Multiply, Divide and Modulus


6DAmKlJEFlE?=JELAoFAH=JoHI=HA:
multiplicative−expression:
cast−expression
multiplicative−expression * multiplicative−expression
multiplicative−expression / multiplicative−expression
multiplicative−expression % multiplicative−expression
6DA oFAH=n@I oB * =n@ / mKIJ D=LA =HEJDmAJE? JOFA. 6DA oFAH=n@I oB % mKIJ >A oB EnJA­
CH=l JOFA. 6DA oFAH=JoH / OEAl@I JDA GKoJEAnJ, % JDA HAm=En@AH, =n@ * JDA FHo@K?J oB JDA
oFAH=n@I.1B b EInon-zAHoJDAn a == (a/b) + a%b IDoKl@=lM=OI>AJHKA.

5.16. Add and Subtract


6DA=@@EJELAoFAH=JoHI=HA:
additive−expression:
multiplicative−expression
additive−expression + multiplicative−expression
additive−expression − multiplicative−expression
6DA + oFAH=JoH ?omFKJAI JDA IKm oB EJI oFAH=n@I. -EJDAH onA oB JDA oFAH=n@I m=O >A =
FoEnJAH. 1B P EI =n ANFHAIIEon OEAl@EnC = FoEnJAH Jo JOFA T JDAn P+n EI JDA I=mA =I
p+(sizeof(T)*n). 6DA − oFAH=JoH ?omFKJAI JDA @EBBAHAn?A oB EJI oFAH=n@I. 6DA
BEHIJ oFAH=n@ m=O >AoBFoEnJAHoH=HEJDmAJE?JOFA.6DAIA?on@oFAH=n@mKIJ>AoB=HEJD­
mAJE? JOFA. 1B P EI =n ANFHAIIEon OEAl@EnC = FoEnJAH oB JOFA T JDAn P−n EI JDA I=mA =I
p−(sizeof(T)*n). 6DKI EB P EI = FoEnJAH Jo =n AlAmAnJ oB =n =HH=O, P+1 MEll FoEnJ Jo
JDAnANJo>jA?JEnJDA=HH=O=n@ P−1 MEllFoEnJJoJDAFHALEoKIo>jA?JEnJDA=HH=O.

5.17. Shift Operators


6DAIDEBJoFAH=JoHIFAHBoHm>EJMEIAIDEBJI:
shift−expression:
additive−expression
shift−expression << additive−expression
shift−expression >> additive−expression
1B JDA BEHIJ oFAH=n@ EI KnIECnA@, << FAHBoHmI = loCE?=l lABJ IDEBJ >O additive−expression
>EJI. 1B JDA BEHIJ oFAH=n@ EI IECnA@, << FAHBoHmI =n =HEJDmAJE? lABJ IDEBJ >O additive−
expression >EJI. 6DA shift−expression mKIJ >A oB EnJACH=l JOFA. 6DA >> oFAH=JoH EI =
HECDJIDEBJ=n@BolloMIJDAI=mAHKlAI=IlABJIDEBJ.

5.18. Relational Operators


6DAL=lKAIoBANFHAIIEonI?=n>A?omF=HA@=IBolloMI:
­ ­

relational−expression:
shift−expression
relational−expression < shift−expression
relational−expression > shift−expression
relational−expression <= shift−expression
relational−expression >= shift−expression
6DA oFAH=JoHI =HA < lAII JD=n, > CHA=JAH JD=n, <= lAII JD=n oH AGK=l Jo =n@ >=
CHA=JAH JD=n oH AGK=l Jo. 6DA oFAH=n@I mKIJ >A oB =HEJDmAJE? oH FoEnJAH JOFA. 6DA
L=lKA oB JDA ANFHAIIEon EI  EB JDA HAl=JEon EI JHKA, oJDAHMEIA . 6DA KIK=l =HEJDmAJE?
?onLAHIEonI =HA FAHBoHmA@. 2oEnJAHI m=O onlO >A ?omF=HA@ Jo FoEnJAHI oB JDA I=mA
JOFAoHoBJOFA void*.

5.19. Equality operators


6DAAGK=lEJOoFAH=JoHI=HA:
equality−expression:
relational−expression
relational−expression == equality−expression
relational−expression != equality−expression
6DA oFAH=JoHI == AGK=l Jo =n@ != noJ AGK=l BolloM JDA I=mA HKlAI =I HAl=JEon=l oFAH­
=JoHI. 6DA AGK=lEJO oFAH=JEonI m=O >A =FFlEA@ Jo ANFHAIIEonI OEAl@EnC ?D=nnAlI =n@
FolOmoHFDE? JOFAI BoH ?omF=HEIon MEJD JDA L=lKA nil. ) FoEnJAH oB L=lKA nil oH JOFA
void* m=O>A?omF=HA@Jo=nOFoEnJAH.

5.20. Bitwise Logic Operators

AND−expression:
equality−expression
AND−expression & equality−expression

XOR−expression:
AND−expression
XOR−expression ^ AND−expression

OR−expression:
XOR−expression
OR−expression | XOR−expression
6DA oFAH=JoHI FAHBoHm >EJMEIA loCE?=l oFAH=JEonI =n@ =FFlO onlO Jo EnJACH=l JOFAI. 6DA
oFAH=JoHI=HA & >EJMEIA=n@, ^ >EJMEIAAN?lKIELAoH=n@ | >EJMEIAEn?lKIELAoH.

5.21. Logical Operators

logical−AND−expression:
OR−expression
logical−AND−expression && OR−expression

logical−OR−expression:
logical−AND−expression
logical−OR−expression || logical−AND−expression
6DA && oFAH=JoH HAJKHnI  EB >oJD oB EJI oFAH=n@I AL=lK=JA Jo non-zAHo, oJDAHMEIA .
6DA || oFAH=JoH HAJKHnI  EB AEJDAH oB EJI oFAH=n@ AL=lK=JAI Jo non-zAHo, oJDAHMEIA .
*oJD oFAH=JoHI =HA CK=H=nJAA@ Jo AL=lK=JA IJHE?JlO lABJ Jo HECDJ. -L=lK=JEon oB JDA ANFHAI­
IEon MEll ?A=IA =I Ioon JDA BEn=l L=lKA EI @AJAHmEnA@. 6DA oFAH=n@I ?=n >A =nO mEN oB
­ ­

=HEJDmAJE?=n@FoEnJAHJOFAI.

5.22. Constant expressions


) ?onIJ=nJ ANFHAIIEon EI =n ANFHAIIEon MDE?D ?=n >A BKllO AL=lK=JA@ >O JDA ?om­
FElAH@KHEnCJH=nIl=JEonH=JDAHJD=n=JHKnJEmA.
constant−expression:
logical−OR−expression
Constant−expression =FFA=HI =I F=HJ oB EnEJE=lEz=JEon, ?D=nnAl >KBBAH IFA?EBE?=JEonI, =n@
=HH=O @EmAnIEonI. 6DA BolloMEnC oFAH=JoHI m=O noJ >A F=HJ oB = ?onIJ=nJ ANFHAIIEon:
BKn?JEon ?=llI, =IIECnmAnJ, IAn@, HA?AELA, En?HAmAnJ =n@ @A?HAmAnJ. )@@HAII ?omFKJ=­
JEonIKIEnCJDA & =@@HAIIoBoFAH=JoHonIJ=JE?@A?l=H=JEonIEIFAHmEJJA@.

5.23. Assignment
6DA=IIECnmAnJoFAH=JoHI=HA:
assignment−expression:
logical−OR−expression
unary−expression <−= assignment−expression
unary−expression assignment−operator assignment−expression
unary−expression = ( type−cast ) tuple

assignment−operator: one of
= := += *= /= −= %= &= |= ^= >>= <<=
6DA lABJ IE@A oB JDA ANFHAIIEon mKIJ >A =n l-L=lKA. +omFoKn@ =IIECnmAnJ =lloMI JDA
mAm>AHI oB = ?omFlAN JOFA Jo >A =IIECnA@ BHom = mAm>AH lEIJ En = IEnClA IJ=JAmAnJ. )
?omFoKn@ =IIECnmAnJ EI BoHmA@ >O ?=IJEnC = JKFlA EnJo JDA ?omFlAN JOFA. -=?D AlA­
mAnJ oB JDA JKFlA EI AL=lK=JA@ En JKHn =n@ =IIECnA@ Jo EJI ?oHHAIFon@EnC AlAmAnJ En JDA
?omFlANJOFAI.6DAKIK=l?onLAHIEonI=HAFAHBoHmA@BoHA=?D=IIECnmAnJ.
/* Encoding of read message to send to file system */
aggr Readmsg
{
int fd;
void *data;
int len;
};

chan (Readmsg) filesys;

int
read(int fd, void *data, int len)
{
/* Pack message parameters and send to file system */
filesys <−= (Readmsg)(fd, data, len);
}

1B JDA lABJ IE@A oB =n =IIECnmAnJ EI = JKFlA, IAlA?JA@ mAm>AHI m=O >A @EI?=H@A@ >O Fl=?­
EnC nil En JDA ?oHHAIFon@EnC FoIEJEon En JDA JKFlA lEIJ. 1n JDA BolloMEnC AN=mFlA onlO
JDABEHIJ=n@JDEH@EnJACAHIHAJKHnA@BHom func =HA=IIECnA@.
­ !­

(int, int, int) func();

void
main()
{
int a, c;

(a, nil, c) = func();


}

6DA <−= =IIECn IAn@ oFAH=JoH IAn@I JDA L=lKA oB JDA HECDJ IE@A EnJo = ?D=nnAl.
6DA unary−expression mKIJ >A oB JOFA ?D=nnAl oB 6. 1B JDA lABJ IE@A oB JDA ANFHAIIEon
EI oB JOFA ?D=nnAl oB 6, JDA L=lKA JH=nImEJJA@ @oMn JDA ?D=nnAl EI JDA I=mA =I EB JDA
ANFHAIIEonMAHAo>jA?JoBJOFA6=ANFHAIIEon.

5.23.1. Promotion
1B JDA JMo IE@AI oB =n =IIECnmAnJ OEAl@ @EBBAHAnJ ?omFlAN JOFAI JDAn =IIECnmAnJ
FHomoJEon EI FAHBoHmA@. 6DA JOFA oB JDA HECDJ D=n@ IE@A EI IA=H?DA@ BoH =n Knn=mA@
?omFlAN JOFA Kn@AH JDA I=mA HKlAI =I JDA . oFAH=JoH. 1B = m=J?DEnC JOFA EI BoKn@ EJ EI
=IIECnA@JoJDAlABJIE@A.6DEIFHomoJEonEI=lIoFAHBoHmA@BoHBKn?JEon=HCKmAnJI.

5.23.2. Polymorphic Assignment


6DAHA =HA JMo oFAH=JoHI BoH =IIECnEnC FolOmoHFDE? L=lKAI. 6DA HABAHAn?A =IIECn­
mAnJoFAH=JoH = ?oFEAIJDAB=JFoEnJAH..oHAN=mFlA:
typedef Poly;
Poly a, b;
int i;

a = (alloc Poly)i;
b = a;

?=KIAI a Jo >A CELAn = B=J FoEnJAH Jo = ?oFO oB JDA L=HE=>lA i =n@ b Jo D=LA = @EIJEn?J B=J
FoEnJAH FoEnJEnC Jo JDA I=mA ?oFO oB i. 2olOmoHFDE?L=HE=>lAI=IIECnA@MEJDJDA = oFAH­
=JoHmKIJ>AoBJDAI=mAFolOmoHFDE?n=mA.
6DA L=lKA =IIECnmAnJ oFAH=JoH := ?oFEAI JDA L=lKA oB onA FolOmoHFDE? L=HE=>lA Jo
=noJDAH. 6DA L=HE=>lA =n@ L=lKA mKIJ >A oB JDA I=mA FolOmoHFDE? n=mA =n@ mKIJ HAF­
HAIAnJ L=lKAI oB JDA I=mA JOFA; JDAHA EI no EmFlE?EJ JOFA FHomoJEon. 1n F=HJE?Kl=H, JDA
L=HE=>lA >AEnC =IIECnA@ Jo mKIJ =lHA=@O >A @ABEnA@, =I EJ mKIJ D=LA >oJD = JOFA =n@
IJoH=CA. .oHAN=mFlA:
typedef Poly;
Poly a, b, c;
int i, j;

a = (alloc Poly)i;
b = (alloc Poly)j;
b := a;
c := a; /* illegal */

?=KIAI a Jo >A CELAn = B=J FoEnJAH Jo = ?oFO oB JDA L=HE=>lA i =n@ b Jo >A CELAn = B=J
FoEnJAH Jo = ?oFO oB JDA L=HE=>lA j. 6DA L=lKA =IIECnmAnJ b:=a ?oFEAI JDA L=lKA oB i
BHom JDA IJoH=CA HABAHAn?A@ >O JDA B=J FoEnJAH oB a Jo JDA IJoH=CA HABAHAn?A@ >O b, MEJD
JDA HAIKlJ >AEnC JD=J a =n@ b FoEnJ Jo @EIJEn?J ?oFEAI oB JDA L=lKA oB i; JDA HABAHAn?A Jo
JDA L=lKA oB j EI loIJ. 6DA =IIECnmAnJ c:=a EI EllAC=l >A?=KIA c D=I no IJoH=CA Jo Dol@
JDAL=lKA; c EIEnABBA?J=nKnEnEJE=lEzA@FoEnJAH.
) FolOmoHFDE? L=HE=>lA m=O >A =IIECnA@ JDA L=lKA nil. 6DEI =IIECnI JDA L=lKA 
­ "­

JoJDAFoEnJAHAlAmAnJoBJDAB=JFoEnJAH>KJlA=LAIJDAJOFABEAl@Knmo@EBEA@.

5.24. Iterators
6DA EJAH=JEon oFAH=JoH ?=KIAI HAFA=JA@ ANA?KJEon oB JDA IJ=JAmAnJ JD=J ?onJ=EnI
JDAEJAH=JEnCANFHAIIEon>O?onIJHK?JEnC=looFIKHHoKn@EnCJD=JIJ=JAmAnJ.
expression:
assignment−expression
assignment−expression :: assignment−expression
6DAoFAH=n@IoBJDAEJAH=JEonoFAH=JoH=HAJDAEnJACH=l>oKn@I oB JDA looF. 6DA EJAH=JEon
?oKnJAH m=O >A m=@A ANFlE?EJ >O =IIECnEnC JDA L=lKA oB JDA EJAH=JEon ANFHAIIEon Jo =n
EnJACH=l L=HE=>lA; oJDAHMEIA EJ EI EmFlE?EJ. 6DA JMo ANFHAIIEonI =HA AL=lK=JA@ >ABoHA EJAH­
=JEon >ACEnI. 6DA EJAH=JEon EI FAHBoHmA@ MDElA JDA EJAH=JEon ?oKnJAH EI lAII JD=n JDA L=lKA
oB JDA IA?on@ ANFHAIIEon JDA I=mA ?onLAnJEon =I =HH=O >oKn@I. 9DAn JDA ?oKnJAH EI
ANFlE?EJ, EJI L=lKA EI =L=El=>lA JDHoKCDoKJ JDA IJ=JAmAnJ. .oH AN=mFlA, DAHA =HA JMo
EmFlAmAnJ=JEonIoB=IJHEnC?oFOBKn?JEon:
void
copy(byte *to, byte *from)
{
to[0::strlen(from)+1] = *from++;
}

void
copy(byte *to, byte *from)
{
int i;

to[i] = from[i=0::strlen(from)+1];
}

1BEJAH=JoHI=HAnAIJA@,JDAoH@AHoBEJAH=JEonEIKn@ABEnA@.

5.25. Binding and Precedence


6DA>En@EnC=n@FHA?A@An?AoBJDAoFAH=JoHIEIEn@A?HA=IEnCoH@AH:
_______________________________________________________________________________________
_______________________________________________________________________________________
>En@EnC  oFAH=JoH 
 lJoH  () [] −> . 
_______________________________________________________________________________________
 
HJol
_______________________________________________________________________________________
 ! ~ ++ −− <− ? + − * & (cast) sizeof zerox 
_______________________________________________________________________________________
lJoH  * / % 
  
lJoH
_______________________________________________________________________________________
 + − 
_______________________________________________________________________________________
lJoH  << >> 
 HJol  :: 
_______________________________________________________________________________________
 
lJoH
_______________________________________________________________________________________
 < <= > >= 
_______________________________________________________________________________________
lJoH  == != 
  
lJoH
_______________________________________________________________________________________
 & 
_______________________________________________________________________________________
lJoH  ^ 
 lJoH  | 
_______________________________________________________________________________________
 
lJoH
_______________________________________________________________________________________
 && 
_______________________________________________________________________________________
lJoH  || 
  
lJoH
_______________________________________________________________________________________
 <−= = := += −= *= /= %= = ^= |= <<= >>= 
­ #­

6. Statements
5J=JAmAnJI =HA ANA?KJA@ BoH ABBA?J, =n@ @o noJ OEAl@ L=lKAI. 5J=JAmAnJI B=ll EnJo
IALAH=lCHoKFI:
statement:
expression ;
label−statement :
block−statement
selection−statement ;
loop−statement
jump−statement
exception−statement
process−statement ;
allocation−statement ;

6.1. Label Statements


) IJ=JAmAnJ m=O >A FHABENA@ >O =n E@AnJEBEAH. 6DA E@AnJEBEAH l=>AlI JDA IJ=JAmAnJ
=n@ m=O >A KIA@ =I JDA @AIJEn=JEon oB = goto. L=>Al =n@ AN?AFJEon E@AnJEBEAHI D=LA
JDAEHoMnn=mAIF=?A=n@@onoJ?onBlE?JMEJDoJDAHn=mAI.L=>AlID=LABKn?JEonI?oFA.

6.2. Expression Statements


MoIJ ANFHAIIEonI IJ=JAmAnJI =HA BKn?JEon ?=llI oH =IIECnmAnJI. -NFHAIIEonI m=O
>A nKll. NKll ANFHAIIEonI =HA oBJAn KIABKl =I AmFJO >o@EAI Jo l=>AlI oH EJAH=JEon IJ=JA­
mAnJI.

6.3. Block Statements


5ALAH=l IJ=JAmAnJI m=O >A CHoKFA@ JoCAJDAH Jo BoHm = >lo?k. 6DA >o@O oB = BKn?­
JEonEI=>lo?k.
block:
{ autolist slist }
!{ autolist slist }

autolist:
declaration
autolist declaration

slist:
statement
slist statement
)n E@AnJEBEAH @A?l=HA@ En autolist IKIFAn@I =nO FHALEoKI @A?l=H=JEon oB JDA I=mA E@AnJE­
BEAH. )n E@AnJEBEAH m=O >A @A?l=HA@ onlO on?A FAH >lo?k. 6DA@A?l=H=JEonHAm=EnIEnBoH?A
KnJEl JDA An@ oB JDA >lo?k, =BJAH MDE?D =nO IKIFAn@A@ @A?l=H=JEon ?omAI >=?k EnJo
ABBA?J.
6DA L=lKA oB E@AnJEBEAHI @A?l=HA@ En autolist EI Kn@ABEnA@ =J >lo?k AnJHO =n@ IDoKl@
>A=IIECnA@Jo=knoMnL=lKA=BJAH@A?l=H=JEon>KJ>ABoHAKIA.
6DA IOm>ol !{ EnJHo@K?AI = CK=H@A@ >lo?k. OnlO onA JDHA=@ m=O >A ANA?KJEnC JDA
IJ=JAmAnJI?onJ=EnA@EnJDACK=H@A@>lo?k=J=nOEnIJ=nJ.
­ $­

6.4. Selection Statements


5AlA?JEonIJ=JAmAnJI=lJAHJDABloMoB?onJHol>=IA@onJDAL=lKAoB=nANFHAIIEon.
selection−statement:
if ( expression ) statement else statement
if ( expression ) statement
switch expression cbody
typeof expression cbody
alt cbody

cbody:
{ caselist }
!{ caselist }

caselist:
case−item
alt−item
type−item
caselist case−item

case−item:
case constant−expression : statement
default : statement

alt−item:
case expression : statement

type−item:
case ptr−type : statement
)n if IJ=JAmAnJ BEHIJ AL=lK=JAI expression, MDE?D mKIJ OEAl@ = L=lKA oB =HEJDmAJE? oH
FoEnJAH JOFA. 6DA L=lKA oB expression EI ?omF=HA@ MEJD . 1B EJ ?omF=HAI KnAGK=l
statement EI ANA?KJA@. 1B =n else ?l=KIA EI IKFFlEA@ =n@ JDA L=lKA ?omF=HAI AGK=l JDA
else IJ=JAmAnJ MEll >A ANA?KJA@. 6DA else ?l=KIA IDoMI =n =m>ECKEJO En JDA CH=m­
m=H. 6DA =m>ECKEJO EI HAIolLA@ >O m=J?DEnC =n else MEJD JDA nA=HAIJ if MEJDoKJ =n
else =JJDAI=mA>lo?klALAl.
6DA switch IJ=JAmAnJ IAlA?JI onA oB IALAH=l IJ=JAmAnJI >=IA@ on JDA L=lKA oB
expression. 6DA expression EI AL=lK=JA@ =n@ ?onLAHJA@ EnJo =n EnJACAH. 6DA EnJACAH EI
?omF=HA@ MEJD JDA L=lKA IFA?EBEA@ En A=?D case. 1B JDA EnJACAHI ?omF=HA, ?onJHol EI
JH=nIBAHHA@ Jo JDA IJ=JAmAnJ =BJAH JDA m=J?DEnC case. 1B no case EI m=J?DA@, JDA
default ?l=KIA EI ANA?KJA@. 1B JDA default EI omEJJA@ JDAn nonA oB JDA case IJ=JA­
mAnJI EI ANA?KJA@. 6DA case ANFHAIIEon mKIJ OEAl@ =n EnJACAH ?onIJ=nJ. .oH = IEnClA
switch IJ=JAmAnJA=?D?=IAANFHAIIEonmKIJOEAl@=KnEGKAL=lKA.
9EJDEn = switch, alt, oH typeof ANA?KJEon FHo?AA@I noHm=llO AN?AFJ JD=J =
break IJ=JAmAnJMEllJAHmEn=JAJDAIAlA?JEonIJ=JAmAnJ.
6DA typeof IJ=JAmAnJ IAlA?JI onA oB IALAH=l IJ=JAmAnJI >=IA@ on JDA JOFA oB
expression. 6DA expression mKIJ >A oB FolOmoHFDE? JOFA. 6DA ANFHAIIEon EI AL=lK=JA@
=n@ JDA HAIKlJEnC JOFA EI ?omF=HA@ MEJD JDA JOFA IFA?EBEA@ >O A=?D case. 1B JDA JOFAI
m=J?D, JDA IJ=JAmAnJ F=HJ oB JDA ?oHHAIFon@EnC case EI ANA?KJA@. )ll JDA ?=IAI mKIJ
D=LA = @EIJEn?J JOFA MEJDEn = IEnClA typeof IJ=JAmAnJ. 1B no case EI m=J?DA@, JDA
default ?l=KIA EI ANA?KJA@, EB onA ANEIJI; oJDAHMEIA nonA oB JDA case IJ=JAmAnJI EI
ANA?KJA@. 1B JDA expression EI = IEmFlA L=HE=>lA, JDAn MEJDEn JDA IJ=JAmAnJ IKFFlEA@ >O
JDA case, JDA L=lKA EI n=HHoMA@ Jo JDA JOFA oB JD=J case. 1n JDA default ?=IA MDAHA
expression EI=IEmFlAL=HE=>lAJDAJOFAHAm=EnIFolOmoHFDE?.
­ %­

typeof v {
case int:
print("int=%d", v); /* v passed as int */
break;
case float:
print("float=%f", v); /* v passed as float */
break;
default:
usertype(v); /* still polymorphic */
break;
}

6DA typeof IJ=JAmAnJEIJDAonlOM=OJon=HHoMJDAJOFAoB=FolOmoHFDE?L=lKA.


6DA alt IJ=JAmAnJ =lloMI JDHA=@I Jo FAHBoHm ?ommKnE?=JEon on IALAH=l ?D=nnAlI
IEmKlJ=nAoKIlO MEJDoKJ FollEnC. 6DA ANFHAIIEon En A=?D case oB =n alt mKIJ ?onJ=En
AEJDAH = IAn@ oH HA?AELA oFAH=JEon. 6DA alt IJ=JAmAnJ FHoLE@AI = B=EH IAlA?J >AJMAAn
HA=@O ?D=nnAlI. ) JDHA=@ MEll HAm=En >lo?kA@ En alt KnJEl onA oB JDA case ANFHAIIEonI
?=n >A AL=lK=JA@ MEJDoKJ >lo?kEnC. 6DA case ANFHAIIEon m=O >A AL=lK=JA@ moHA JD=n
on?A, JDAHABoHA ?=HA IDoKl@ >A J=kAn MDAn KIEnC ANFHAIIEonI MDE?D D=LA IE@A ABBA?JI. 1B
IALAH=l oB JDA case ANFHAIIEonI =HA HA=@O BoH AL=lK=JEon onA EI ?DoIAn =J H=n@om. )
break IJ=JAmAnJ JAHmEn=JAI A=?D ?=IA oB JDA alt. 1B JDA break IJ=JAmAnJ EI omEJJA@
ANA?KJEon MEll FHo?AA@ Jo ANA?KJA JDA ?ommKnE?=JEon oB JDA nANJ ?=IA HAC=H@lAII oB EJI
HA=@EnAIIJo?ommKnE?=JA. .oHAN=mFlA:
chan(Mesg) keyboard, mouse;
Mesg m;

alt {
case m = <−keyboard:
/* Process keyboard event */
break;
case m = <−mouse:
/* Process mouse event */
break;
}

6DA alt IJ=JAmAnJ EI =lIo KIA@ Jo @EI?HEmEn=JA >AJMAAn JDA JOFA oB L=lKAI
HA?AELA@ BHom ?D=nnAlI oB L=HE=nJ FHoJo?olI. 1n JDEI BoHm A=?D case−item oB JDA alt
mKIJ >A = IEmFlA =IIECnmAnJ. 6DA HECDJ D=n@ IE@A mKIJ ?onJ=En = ?ommKnE?=JEon oFAH­
=JEon on = ?D=nnAl MDE?D IKFFlEAI = L=HE=nJ FHoJo?ol. 6DA JOFA oB JDA l-L=lKA EI KIA@ Jo
m=J?D = JOFA En JDA L=HE=nJ FHoJo?ol. )n alt m=O >A FAHBoHmA@ on =n =H>EJH=HO IAJ oB
L=HE=nJ FHoJo?ol ?D=nnAlI Io lonC =I no JOFA EI IKFFlEA@ >O moHA JD=n onA ?D=nnAl.
6DAHA mKIJ >A = case ?l=KIA BoH A=?D JOFA IKFFlEA@ >O JDA KnEon oB =ll ?D=nnAl JOFAI;
)lABHAGKEHAIJDAm=J?D=C=EnIJJOFAIJo>AAND=KIJELA. .oHAN=mFlA:
­ &­

Aggr1 a;
Aggr2 b;
Aggr3 c;

chan (Aggr1, Aggr2, Aggr3) ch;

alt {
case a = <−ch:
print("received Aggr1");
break;
case b = <−ch:
print("received Aggr2");
break;
case c = <−ch:
print("received Aggr3");
break;
}

1B =n alt EI FAn@EnC on = ?D=nnAl JDA FHoCH=mmAH mKIJ AnIKHA JD=J oJDAH JDHA=@I
@o noJ FAHBoHm =n oFAH=JEon oB JDA I=mA JOFA on JDA ?D=nnAl KnJEl JDA alt EI ?omFlAJA.
OJDAHMEIAJDA alt onJD=J?D=nnAlm=O>lo?kEBL=lKAI=HAHAmoLA@>OJDAoJDAHJDHA=@.
6DA IOm>ol !{ EnJHo@K?AI = CK=H@A@ caselist. OnlO onA JDHA=@ m=O >A ANA?KJEnC
JDAIJ=JAmAnJI?onJ=EnA@EnJDACK=H@A@?=IAlEIJ=J=nOEnIJ=nJ.

6.5. Loop Statements


5ALAH=llooF?onIJHK?JI=HAFHoLE@A@:
loop−statement:
while ( expression ) statement
do statement while ( expression ) ;
for ( expression ; expression ; expression ) statement
1n while =n@ do looFI JDA IJ=JAmAnJ EI HAFA=JA@ KnJEl JDA ANFHAIIEon AL=lK=JAI Jo .
6DA ANFHAIIEon mKIJ OEAl@ AEJDAH =n =HEJDmAJE? oH FoEnJAH JOFA. 1n JDA while looF JDA
ANFHAIIEonEIAL=lK=JA@=n@JAIJA@>ABoHAJDA IJ=JAmAnJ. 1n JDA do looF JDA IJ=JAmAnJ EI
ANA?KJA@>ABoHAJDAANFHAIIEonEIAL=lK=JA@=n@JAIJA@.
1n JDA for looF JDA BEHIJ ANFHAIIEon EI AL=lK=JA@ on?A >ABoHA looF AnJHO. 6DA
ANFHAIIEon EI KIK=llO KIA@ Jo EnEJE=lEzA JDA looF L=HE=>lA. 6DA IA?on@ ANFHAIIEon EI AL=l­
K=JA@ =J JDA >ACEnnEnC oB A=?D looF EJAH=JEon, En?lK@EnC JDA BEHIJ. 6DA ANFHAIIEon mKIJ
OEAl@ AEJDAH = FoEnJAH oH =HEJDmAJE? JOFA. 6DA IJ=JAmAnJ EI ANA?KJA@ MDElA JDA AL=lK=JEon
oB JDA IA?on@ ANFHAIIEon @oAI noJ ?omF=HA Jo . 6DA JDEH@ ANFHAIIEon EI AL=lK=JA@ =BJAH
JDA IJ=JAmAnJ on A=?D looF EJAH=JEon. 6DA BEHIJ =n@ JDEH@ ANFHAIIEonI D=LA no JOFA
HAIJHE?JEonI. )ll oB JDA ANFHAIIEonI =HA oFJEon=l. 1B JDA IA?on@ ANFHAIIEon EI omEJJA@ =n
ANFHAIIEonHAJKHnEnC=non-zAHoL=lKAEIEmFlEA@.

6.6. Jump Statements


JKmFIJ=JAmAnJIJH=nIBAH?onJHolKn?on@EJEon=llO.
­ '­

jump−statement:
goto identifier ;
continue countopt ;
break countopt ;
return expressionopt ;
become expression ;

count:
integer−constant
goto JH=nIBAHI?onJHolJoJDAl=>Al identifier,MDE?DmKIJ>AEnJDA?KHHAnJBKn?JEon.

6.6.1. Continue Statements


6DA continue IJ=JAmAnJ m=O onlO =FFA=H =I F=HJ oB = looF IJ=JAmAnJ. 1B count EI
omEJJA@ JDA continue IJ=JAmAnJ JH=nIBAHI ?onJHol Jo JDA looF-?onJEnK=JEon FoHJEon oB
JDA Im=llAIJ An?loIEnC EJAH=JEon IJ=JAmAnJ, JD=J EI, JDA An@ oB JD=J looF. 1B count EI IKF­
FlEA@ continue JH=nIBAHI ?onJHol Jo JDA looF ?onJEnK=JEon oB IomA oKJAH nAIJA@ looF.
Count IFA?EBEAI JDA nKm>AH oB looFI Jo IkEF. 6DA IJ=JAmAnJ continue MEJD no count EI
JDAI=mA=I continue 1. .oHAN=mFlA:
while(1) {
while(1) {
continue 2; /* Same as goto contin; */
}
contin: /* Continue comes here */
}

6.6.2. Break Statements


,ABEnA compound Jo >A = IAlA?JEon oH looF IJ=JAmAnJ. 6DA break IJ=JAmAnJ m=O
onlO =FFA=H =I F=HJ oB IK?D = ?omFoKn@. 1B count EI omEJJA@, JDAn JDA >HA=k JAHmEn=JAI
JDA IJ=JAmAnJ FoHJEon oB JDA ?omFoKn@ =n@ JH=nIBAHI ?onJHol Jo JDA IJ=JAmAnJ =BJAH JDA
?omFoKn@. 1B count EI IKFFlEA@, >HA=k ?=KIAI JAHmEn=JEon oB JDA IomA nAIJA@ ?om­
FoKn@. Count EI JDA nKm>AH oB nAIJA@ ?omFoKn@I Jo JAHmEn=JA. ) break MEJD no
count EI JDA I=mA =I break . 1n = IAlA?JEon IJ=JAmAnJ, break JAHmEn=JAI ANA?KJEon
oBJDA?=IAEnJDAIAlA?JEon,=n@JDKIFHALAnJIB=llEnCJDHoKCD JoJDAnANJ?=IA.

6.6.3. Return Statement


) BKn?JEon HAJKHnI Jo EJI ?=llAH KIEnC = return IJ=JAmAnJ. )n ANFHAIIEon EI
HAGKEHA@ KnlAII JDA BKn?JEon EI @A?l=HA@ =I HAJKHnEnC JDA JOFA void. 6DA HAIKlJ oB
expression EIAL=lK=JA@KIEnCJDAHKlAIoB=IIECnmAnJJoJDAHAJKHnJOFAoBJDABKn?JEon.

6.6.4. Become Statement


6DA become IJ=JAmAnJ JH=nIBoHmI JDA ANA?KJEon oB JDA ?KHHAnJ BKn?JEon EnJo JDA
?=l?Kl=JEon oB JDA expression CELAn =I EJI =HCKmAnJ. 1B expression EI noJ EJIAlB = BKn?JEon
?=ll,JDAn EJ mKIJ D=LA JDA I=mA JOFA =I JDA HAJKHn L=lKA oB JDA ?=llAH =n@ JDA >AD=LEoH EI
=n=loCoKI Jo = return IJ=JAmAnJ. 1B, DoMALAH, EJ EI = BKn?JEon ?=ll, JDAn EJ nAA@ onlO
D=LA JDA I=mA HAJKHn JOFA; JDA =HCKmAnJ lEIJ m=O >A @EBBAHAnJ. 9DAn = BKn?JEon P ANA­
?KJAI = become MDoIA ANFHAIIEon EI = ?=ll oB Q, JDA ABBA?J EI AN=?JlO =I EB JDA ?=llAH oB P
D=@ EnIJA=@ ?=llA@ Q MEJD JDA =FFHoFHE=JA =HCKmAnJI BHom P. 1n F=HJE?Kl=H, JDA IJ=?k
BH=mA BoH P EI oLAHMHEJJAn >O JDA BH=mA BoH Q; BKn?JEonI JD=J EnLokA onA =noJDAH MEJD
become MEllANA?KJAEn?onIJ=nJIJ=?kIF=?A.
­!­

6.7. Exception Statements


6DA rescue, raise, =n@ check IJ=JAmAnJI =HA FHoLE@A@ BoH KIA En AHHoH HA?oL­
AHO:
exception−statement:
raise identifieropt ;
rescue identifieropt block
check expression ;
check expression , string−constant ;

6.7.1. Raise and Rescue Statement


7n@AH noHm=l ANA?KJEon = rescue >lo?k EI noJ ANA?KJA@. ) raise =BJAH =
rescue IJ=JAmAnJ JH=nIBAHI ?onJHol Jo JDA ?loIAIJ FHALEoKIlO @ABEnA@ rescue IJ=JA­
mAnJ En JDA I=mA BKn?JEon. -NA?KJEon BloMI JDHoKCD JDA An@ oB JDA rescue >lo?k >O
@AB=KlJ.
-NA?KJEon D=I no ABBA?J on JDA ?onnA?JEon >AJMAAn raise =n@ rescue IJ=JA­
mAnJI. 1B =n E@AnJEBEAH EI IKFFlEA@ En = raise IJ=JAmAnJ, ?onJHol EI JH=nIBAHHA@ Jo JDA
n=mA@ rescue IJ=JAmAnJ. .oHAN=mFlA,JDAIAJMoBH=CmAnJI=HAAGKEL=lAnJ:
alloc p; alloc p;
rescue { goto notrescue;
unalloc p; dorescue:
raise; unalloc p;
} goto nextrescue;
notrescue:
if(error) if(error)
raise; goto dorescue;

MKlJEFlA rescue IJ=JAmAnJI m=O >A ?=I?=@A@ Jo FAHBoHm ?omFlAN AHHoH HA?oLAHO
=?JEonI:
alloc a, b;
rescue {
unalloc a, b;
return 0;
}

alloc c;
rescue {
unalloc c;
raise;
}

dostuff();

if(error)
raise;

6.7.2. Check Statement


6DA check IJ=JAmAnJJAIJI=n =IIAHJEon. 1B JDA =IIAHJEon B=ElI, JDA HKnJEmA ?=llI =n
AHHoH D=n@lAH. *O @AB=KlJ JDA D=n@lAH MHEJAI = mAII=CA Jo IJ=n@=H@ AHHoH =n@ ANEJI MEJD
JDA IJ=JKI ALEFcheck. ) KIAH-IKFFlEA@ AHHoH D=n@lAH m=O >A EnIJ=llA@ >O IAJJEnC =
D=n@lAHLA?JoH. 6DAFHoJoJOFABoHJDALA?JoHEI:
void (*ALEFcheck)(byte*, byte*);

6DA BEHIJ IJHEnC =HCKmAnJ, IKFFlEA@ >O JDA ?omFElAH, EI oB JDA BoHm file:line:
­!­

func() 6DA IA?on@ =HCKmAnJ F=IIA@ Jo JDA D=n@lAH MEll >A JDA string−constant oH JDA
@AB=KlJ IJHEnC check EB no IJHEnC EI IKFFlEA@ >O JDA IJ=JAmAnJ. 6DA ANFHAIIEon EI AL=lK­
=JA@ =n@ ?omF=HA@ Jo . 1B JDA ?omF=HA IK??AA@I JDA =IIAHJEon D=I B=ElA@. .oH AN=m­
FlA,JDAHKnJEmA?DA?kIJDAHAJKHnBHommAmoHO=llo?=JEonlEkAJDEI:
ptr = malloc(n);
check ptr != nil, "no memory";

6.8. Process Control Statements


)n )lAB FHoCH=m ?onIEIJI oB onA oH moHA FHAAmFJELAlO I?DA@KlA@ FHo?AIIAI ?=llA@
procs, A=?D oB MDE?D ?onIEIJI oB onA oH moHA ?oHoKJEnAI ?=llA@ tasks. )n )lAB FHoCH=m
EI=lM=OIANA?KJEnCMEJDEnIomAJ=Ik.
6DAIAIJ=JAmAnJI?HA=JAFHo?I=n@J=IkI:
process−statement:
proc function−call ;
task function−call ;
par block
6DA proc IJ=JAmAnJ ?HA=JAI = nAM FHo?, MDE?D IJ=HJI HKnnEnC JDA n=mA@ BKn?JEon. 6DA
=HCKmAnJI Jo function−call =HA AL=lK=JA@ >O JDA oHECEn=l FHo?. 5En?A FHo?I =HA I?DA@­
KlA@ FHAAmFJELAlO, JDA EnJAHlA=LEnC oB JDAEH ANA?KJEon EI Kn@ABEnA@. 9D=J HAIoKH?AI =
FHo? ID=HAI MEJD EJI F=HAnJ EI @ABEnA@ >O JDA EmFlAmAnJ=JEon. ) FHo? EI EnEJE=llO ?HA=JA@
MEJD=IEnClAJ=Ik,MDE?D>ACEnIANA?KJEon=JJDABKn?JEon?=ll.
6DA task IJ=JAmAnJ ?HA=JAI = ?oHoKJEnA MEJDEn JDA I=mA FHo?, MDE?D >ACEnI ANA­
?KJEon =J JDA BKn?JEon ?=ll. 6DA FHo? EI m=EnJ=EnA@ KnJEl =ll JDA J=IkI D=LA ?omFlAJA@. )
J=Ik ?omFlAJAI MDAn EJ HAJKHnI BHom EJI EnEJE=l BKn?JEon oH ?=llI JDA lE>H=HO BKn?JEon
terminate. )ll oB JDA J=IkI MEJDEn = FHo? ID=HA mAmoHO, En?lK@EnC =??AII Jo JDA
IJ=?k oB A=?D J=Ik. 6=IkI =HA non-FHAAmFJELA: JDAO =HA I?DA@KlA@ @KHEnC mAII=CA
F=IIEnC =n@ IOn?DHonEz=JEon FHEmEJELAI onlO. 1n >oJD JDA proc =n@ task IJ=JAmAnJI,
JDABKn?JEon?=llF=H=mAJAHI=HAAL=lK=JA@EnJDAoHECEn=lJ=Ik.
6DA IOn?DHonEz=JEon FHEmEJELAI JD=J ?=n ?=KIA J=Ik IMEJ?DEnC =HA @ABEnA@ >O =
lE>H=HO. 6DAO =HA QLock.lock =n@ Rendez.sleep. 6DA ?ommKnE?=JEon oFAH=JEonI
MDE?D ?=n ?=KIA J=Ik IMEJ?DEnC =HA alt, <−= IAn@ =n@ <− HA?AELA. ) FHo?AII JD=J
?onJ=EnI IALAH=l J=IkI MEll ANEIJ KnJEl =ll JDA J=IkI MEJDEn JDA FHo?AII D=LA ANEJA@. 1n
JKHn, = FHoCH=m MEll ANEIJ KnJEl =ll oB JDA FHo?AIIAI En JDA FHoCH=m D=LA ANEJA@. ) FHo­
?AII oH J=Ik m=O ANEJ ANFlE?EJlO >O ?=llEnC JDA BKn?JEon exits oH >O HAJKHnEnC BHom JDA
BKn?JEonEnMDE?DEJM=IEnLokA@.
6DA par IJ=JAmAnJ EmFlAmAnJI BoHk/FHo?AII/joEn. ) nAM FHo?AII EI ?HA=JA@ BoH
A=?D IJ=JAmAnJ En JDA >lo?k. 6DA par IJ=JAmAnJ ?omFlAJAI MDAn =ll FHo?AIIAI D=LA
?omFlAJA@ ANA?KJEon oB JDAEH IJ=JAmAnJI. ) par MEJD = IEnClA IJ=JAmAnJ EI JDA I=mA =I
= >lo?k. 6DA FHo?AIIAI MEJDEn = par D=LA JDA I=mA mAmoHO ID=HEnC mo@Al =I FHo?I
=n@ ID=HA =ll =KJom=JE?I =n@ F=H=mAJAHI oB JDA BKn?JEon ANA?KJEnC JDA par. Locks oH
QLocks m=O >A KIA@ Jo IOn?DHonEzA MHEJA =??AII Jo JDA ID=HA@ L=HE=>lAI. 6DA FHo?AII
JD=JAnJAHA@JDA par EICK=H=nJAA@Jo>AJDAI=mAFHo?AIIJD=JANEJI.

6.9. Allocation Statements


MAmoHOm=n=CAmAnJIJ=JAmAnJI=llo?=JA=n@BHAAmAmoHOBoHo>jA?JI:
­! ­

allocation−statement:
alloc alloclist ;
unalloc alloclist ;

alloclist:
expression
alloclist , expression

6.9.1. Alloc Statement


6DA alloc IJ=JAmAnJ J=kAI = lEIJ oB FoEnJAHI, MDE?D mKIJ =lIo >A l-L=lKAI. 1n
IJHE?JlO lABJ Jo HECDJ oH@AH, BoH A=?D FoEnJAH, mAmoHO EI HAIAHLA@ BoH =n o>jA?J oB =FFHo­
FHE=JA JOFA =n@ EJI =@@HAII EI =IIECnA@ Jo JDA FoEnJAH. 6DA mAmoHO EI CK=H=nJAA@ Jo >A
BEllA@ MEJD zAHoI. 1B JDA =llo?=JEon B=ElI >A?=KIA JDAHA EI EnIKBBE?EAnJ mAmoHO = check
?on@EJEonMEll>ACAnAH=JA@MEJDJDA=HCKmAnJIJHEnC no memory.
1B JDA expression D=I chan JOFA, JDA HKnJEmA IOIJAm MEll =lIo EnEJE=lEzA JDA nAM
?D=nnAl. *KBBAHIMEll>A=llo?=JA@BoH=IOn?DHonoKI?D=nnAlI. .oHAN=mFlA:
chan(int) a;
chan(int)[10] *p;

alloc a, p, *p;

6o =llo?=JA = FolOmoHFDE? L=lKA = ?=IJ ANFHAIIEon EI KIA@ =I @ABEnA@ En JDA IA?JEon on


+=IJI.

6.9.2. Unalloc Statement


6DA unalloc IJ=JAmAnJ HAlA=IAI mAmoHO. 6DA =HCKmAnJ Jo unalloc mKIJ D=LA
>AAn HAJKHnA@ >O = IK??AIIBKl alloc oH >A nil. 7n=llo? oB nil D=I no ABBA?J. 1B =n
o>jA?J EI Kn=llo?=JA@ JME?A, oH =n EnL=lE@ o>jA?J EI Kn=llo?=JA@, JDA HKnJEmA IOIJAm MEll
CAnAH=JA= check ?on@EJEonMEJDJDAmAII=CAIJHEnC arena corrupted.

6.10. Lock
6DA Lock ),6 FHoLE@AI IFEn lo?kI. 6Mo oFAH=JEonI =HA FHoLE@A@. Lock.lock
?l=EmI JDA lo?k EB BHAA, oJDAHMEIA EJ >KIO looFI KnJEl JDA lo?k >A?omAI BHAA.
Lock.unlock HAlA=IAI=lo?k=BJAHEJD=I>AAn?l=EmA@.
Lo?k ),6I D=LA no HKnJEmA IJ=JA =n@ m=O >A @On=mE?=llO =llo?=JA@. 6DA JDHA=@
MDE?D?l=EmA@JDAlo?knAA@noJ>AJDAJDHA=@MDE?DKnlo?kIEJ.

6.11. QLock
6DA QLock ),6 FHoLE@AI >lo?kEnC mKJK=l AN?lKIEon. 1B JDA lo?k EI BHAA
QLock.lock ?l=EmI JDA lo?k. .KHJDAH =JJAmFJI Jo C=En JDA lo?k MEll ?=KIA JDA JDHA=@
Jo >A IKIFAn@A@ KnJEl JDA lo?k >A?omAI BHAA. 6DA lo?k EI HAlA=IA@ >O ?=llEnC
QLock.unlock.
6DAJDHA=@MDE?D?l=EmA@JDAlo?knAA@noJ>AJDAJDHA=@MDE?DKnlo?kIEJ.
QLock ),6I D=LA HKnJEmA IJ=JA =n@ m=O >A @On=mE?=llO =llo?=JA@ FHoLE@A@ JDAO
=HAKn=llo?=JA@onlOMDAnKnlo?kA@.

7. The Plan 9 Implementation


6DA HKnJEmA, IKFFoHJ BKn?JEonI, =n@ >=IE? lE>H=HO BoH )lAB =HA ?onJ=EnA@ En = IEnClA
lE>H=HO @o?KmAnJA@ En IA?JEon oB JDA 2l=n ' 2HoCH=mmAHI M=nK=l. 6DA En?lK@A BElA
<alef.h> ?onJ=EnI FHoJoJOFAI BoH JDA lE>H=HO. ) pragma lib @EHA?JELA JAllI vl Jo
lo=@ JDA ?oHHA?J lE>H=HO AlAmAnJI =KJom=JE?=llO. 6DA pragma @EHA?JELAI IKFFoHJA@ >O
­!!­

JDA ?omFElAH =HA @o?KmAnJA@ >O JDA ?omFElAH m=nK=l F=CA alef(1). 6DA ?omFElAH
ECnoHAIKnHA?oCnEzA@ pragma @EHA?JELAI.
1n 2l=n ' =ll FHo?I En =n )lAB FHoCH=m ID=HA JDA I=mA =@@HAII IF=?A. 9DAn = J=Ik
FAHBoHmI=IOIJAm?=ll,=llJ=IkIMEJDEnEJIFHo?MEll>A>lo?kA@KnJElJDAIOIJAm?=ll?om­
FlAJAI.
2HoCH=mI IDoKl@ noJ HA?AELA noJAI KnlAII JDA FHoCH=mmAH ?=n CK=H=nJAA JDA HKn­
JEmAIOIJAmMEllnoJ>AEnJAHHKFJA@.
)?D=nnAlm=O>AEnLolLA@EnnomoHAJD=nonA alt =J=nOJEmA.
6DA?omFElAH@oAInoJIKFFoHJ lint =n@ ulint ALAnJDoKCDJDAO=HA@ABEnA@.
5J=?k >oKn@I ?DA?kEnC EI noJ EmFlAmAnJA@. 6DA ANJAHn=l L=HE=>lA ALEFstack
@ABEnAI JDA nKm>AH oB >OJAI =llo?=JA@ BoH JDA IJ=?k oB A=?D J=Ik. 6DA ALEFstack L=HE­
=>lA ?=n >A ?D=nCA@ =nO JEmA, =n@ EI Clo>=l Jo =ll J=Ik ?HA=JEon. 6DA @AB=KlJ IJ=?k IEzA EI
$ >OJAI. 6DA lE>H=HO BKn?JEon doprint D=I =  " >OJA =KJom=JE? =HH=O Io
ALEFstack IDoKl@noJ>AlAIIJD=n "&>OJAI.
6DA HKnJEmA IOIJAm KIAI JDA rendezvous  IOIJAm ?=ll Jo IOn?DHonEzA FHo?I MEJDEn
=n )lAB FHoCH=m. 6DA HAn@AzLoKI J=C IF=?A EI F=HJ oB JDA n=mA IF=?A CHoKF, Io ?=HA
mKIJ >A J=kAn En BoHkEnC JDA n=mA IF=?A MEJD 4.N)M-/. .oH AN=mFlA =BJAH =n
rfork(RFNAMEG) = J=Ik ?=nnoJ IOn?DHonEzA oH AN?D=nCA mAII=CAI MEJD =noJDAH
FHo?. ) Coo@ AN=mFlA oB JDA ?o@A nA?AII=HO Jo FAHBoHm JDEI oFAH=JEon ?=n >A BoKn@ En
JDAIoKH?AJo acme.
) HAl=JA@ EIIKA EI JD=J FHoCH=mI JD=J @o noJ BoHk JDAEH n=mA IF=?A m=O ?ollE@A MEJD
oJDAH FHoCH=mI ID=HEnC JDA IF=?A, Io KnlAII JDAHA EI IJHonC HA=Ion noJ Jo, =n )lAB FHo­
CH=mIDoKl@?=ll rfork(RFNAMEG) A=HlO.
6DAHKnJEmAKIAIJDAL=HE=>lA ALEFrfflag =I JDA =HCKmAnJ Jo rfork  MDAn ?HA­
=JEnC = FHo?. *O @AB=KlJ ALEFrfflag EI IAJ Jo RFNOWAIT|RFMEM|RFPROC. 1J m=O
>A mo@EBEA@, BoH AN=mFlA >O ?lA=HEnC RFNOWAIT Jo FAHmEJ = FHo? Jo wait  BoH = ?DEl@
FHo? Jo ANEJ. 6DA L=lKA oB ALEFrfflag IDoKl@ >A HAIJoHA@ EmmA@E=JAlO =BJAH JDA
rfork.
) KnEGKA E@AnJEBEAH BoH A=?D J=Ik m=O >A BoKn@ >O ?=llEnC JDA BKn?JEon ALEF_tid,
@A?l=HA@
uint ALEF_tid();

En <alef.h>. 6DA E@AnJEBEAH EI KIABKl BoH @A>KCCEnC; BoH AN=mFlA, EJ EI KIA@ En JDA
acid=lABlE>H=HO.
1n JDA IOm>ol J=>lA oB JDA ANA?KJ=>lA, mAm>AH BKn?JEonI oB ),6 JOFAI =HA n=mA@
>O?on?=JAn=JEnCJDA),6n=mA,=nKn@AHI?oHA,=n@JDAmAm>AHn=mA.

8. Yacc Style Grammar


6DA BolloMEnC CH=mm=H EI IKEJ=>lA BoH EmFlAmAnJEnC = O=?? F=HIAH. 7FFAH ?=IA
MoH@I=n@FKn?JK=JEonIKHHoKn@A@>OIEnClAGKoJAI=HAJDAJAHmEn=lIOm>olI.
­!"­

prog: decllist

decllist :
| decllist decl

decl : tname vardecllist ’;’


| tname vardecl ’(’ arglist ’)’ block
| tname adtfunc ’(’ arglist ’)’ block
| tname vardecl ’(’ arglist ’)’ ’;’
| typespec ’;’
| TYPEDEF ztname vardecl zargs ’;’
| TYPEDEF IDENTIFIER ’;’

zargs :
| ’(’ arglist ’)’

ztname : tname
| AGGR
| ADT
| UNION

adtfunc : TYPENAME ’.’ name


| indsp TYPENAME ’.’ name

typespec : AGGR ztag ’{’ memberlist ’}’ ztag


| UNION ztag ’{’ memberlist ’}’ ztag
| ADT ztag zpolytype ’{’ memberlist ’}’ ztag
| ENUM ztag ’{’ setlist ’}’

ztag :
| name
| TYPENAME

zpolytype :
| ’[’ polytype ’]’

polytype : name
| name ’,’ polytype

setlist : sname
| setlist ’,’ setlist

sname :
| name
| name ’=’ expr

name : IDENTIFIER

memberlist : decl
| memberlist decl

vardecllist :
| ivardecl
| vardecllist ’,’ ivardecl

ivardecl : vardecl zinit

zinit :
| ’=’ zelist
­!#­

zelist : zexpr
| ’[’ expr ’]’ expr
| ’.’ stag expr
| ’{’ zelist ’}’
| ’[’ expr ’]’ ’{’ zelist ’}’
| zelist ’,’ zelist

vardecl : IDENTIFIER arrayspec


| indsp IDENTIFIER arrayspec
| ’(’ indsp IDENTIFIER arrayspec ’)’
’(’ arglist ’)’
| indsp ’(’ indsp IDENTIFIER arrayspec ’)’
’(’ arglist ’)’

arrayspec :
| arrayspec ’[’ zexpr ’]’

indsp : ’*’
| indsp ’*’

arglist :
| arg
| ’*’ xtname
| ’.’ xtname
| arglist ’,’ arg

arg : xtname
| xtname indsp arrayspec
| xtname ’(’ indsp ’)’ ’(’ arglist ’)’
| xtname indsp ’(’ indsp ’)’ ’(’ arglist ’)’
| TUPLE tuplearg
| xtname vardecl
| ’.’ ’.’ ’.’

tuplearg : tname
| tname ’(’ indsp ’)’ ’(’ arglist ’)’
| tname vardecl

autolist :
| autolist autodecl

autodecl : xtname vardecllist ’;’


| TUPLE tname vardecllist ’;’

block : ’{’ autolist slist ’}’


| ’!’ ’{’ autolist slist ’}’

slist :
| slist stmnt

tbody : ’{’ ctlist ’}’


| ’!’ ’{’ clist ’}’

ctlist :
| ctlist tcase

tcase : CASE typecast ’:’ slist


| DEFAULT ’:’ slist
­!$­

cbody : ’{’ clist ’}’


| ’!’ ’{’ clist ’}’

clist :
| clist case

case : CASE expr ’:’ slist


| DEFAULT ’:’ slist

rbody : stmnt
| IDENTIFIER block

zlab :
| IDENTIFIER

stmnt : nlstmnt
| IDENTIFIER ’:’ stmnt

info :
| ’,’ STRING_CONST

nlstmnt : zexpr ’;’


| block
| CHECK expr info ’;’
| ALLOC elist ’;’
| UNALLOC elist ’;’
| RESCUE rbody
| RAISE zlab ’;’
| GOTO IDENTIFIER ’;’
| PROC elist ’;’
| TASK elist ’;’
| BECOME expr ’;’
| ALT cbody
| RETURN zexpr ’;’
| FOR ’(’ zexpr ’;’ zexpr ’;’ zexpr ’)’ stmnt
| WHILE ’(’ expr ’)’ stmnt
| DO stmnt WHILE ’(’ expr ’)’
| IF ’(’ expr ’)’ stmnt
| IF ’(’ expr ’)’ stmnt ELSE stmnt
| PAR block
| SWITCH expr cbody
| TYPEOF expr tbody
| CONTINUE zconst ’;’
| BREAK zconst ’;’

zconst :
| CONSTANT

zexpr :
| expr

expr : castexpr
| expr ’*’ expr
| expr ’/’ expr
| expr ’%’ expr
| expr ’+’ expr
| expr ’−’ expr
| expr ’>>’ expr
| expr ’<<’ expr
­!%­

| expr ’<’ expr


| expr ’>’ expr
| expr ’<=’ expr
| expr ’>=’ expr
| expr ’==’ expr
| expr ’!=’ expr
| expr ’&’ expr
| expr ’^’ expr
| expr ’|’ expr
| expr ’&&’ expr
| expr ’||’ expr
| expr ’=’ expr
| expr ’:=’ expr
| expr ’<−’ ’=’ expr
| expr ’+=’ expr
| expr ’−=’ expr
| expr ’*=’ expr
| expr ’/=’ expr
| expr ’%=’ expr
| expr ’>>=’ expr
| expr ’<<=’ expr
| expr ’&=’ expr
| expr ’|=’ expr
| expr ’^=’ expr
| expr ’::’ expr

castexpr : monexpr
| ’(’ typecast ’)’ castexpr
| ’(’ ALLOC typecast ’)’ castexpr

typecast : xtname
| xtname indsp
| xtname ’(’ indsp ’)’ ’(’ arglist ’)’
| TUPLE tname

monexpr : term
| ’*’ castexpr
| ’&’ castexpr
| ’+’ castexpr
| ’−’ castexpr
| ’−−’ castexpr
| ZEROX castexpr
| ’++’ castexpr
| ’!’ castexpr
| ’~’ castexpr
| SIZEOF monexpr
| ’<−’ castexpr
| ’?’ castexpr

ztelist :
| telist

tcomp : expr
| ’{’ ztelist ’}’

telist : tcomp
| telist ’,’ tcomp

term : ’(’ telist ’)’


­!&­

| SIZEOF ’(’ typecast ’)’


| term ’(’ zarlist ’)’
| term ’[’ expr ’]’
| term ’.’ stag
| ’.’ TYPENAME ’.’ stag
| term ’−>’ stag
| term ’−−’
| term ’++’
| term ’?’
| name
| ’.’ ’.’ ’.’
| ARITHMETIC_CONST
| NIL
| ENUM_MEMBER
| STRING_CONST
| ’$’ STRING_CONST

stag : IDENTIFIER
| TYPENAME

zarlist :
| elist

elist : expr
| elist ’,’ expr

tlist : typecast
| typecast ’,’ tlist

tname : sclass xtname


| sclass TUPLE ’(’ tlist ’)’
| sclass ’(’ tlist ’)’

variant : typecast
| typecast ’,’ variant

xtname : INT
| UINT
| SINT
| SUINT
| BYTE
| FLOAT
| VOID
| TYPENAME
| TYPENAME ’[’ variant ’]’
| CHAN ’(’ variant ’)’ bufdim

bufdim :
| ’[’ expr ’]’

sclass :
| EXTERN
| INTERN
| PRIVATE

You might also like