Professional Documents
Culture Documents
Alef
Alef
Alef
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.
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:
!
) ?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.
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.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.
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.
_________________________________________________
_________________________________________________
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.
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.
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
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
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.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.
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:
void
main()
{
int a;
byte* str;
byte c;
(a, str, c) = func();
}
void
main()
{
X x;
byte c;
adt Point
{
int x; /* Access only by member fns */
extern int y; /* by everybody */
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;
void
func()
{
Point p;
6DAHA?AELEnCBKn?JEonEI@ABEnA@=I:
Point
Point.set(Point *p)
{
...
}
!
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.
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@.
"
aggr B
{
A *aptr;
B *bptr;
};
aggr A
{
A *aptr;
B *bptr;
};
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@.
tag:
typename
identifier
argument−list:
expression
argument−list , expression
$
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;
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.
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@.
&
unary−operator: one of
? * !
+ − ~
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.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.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;
6DA onlO oJDAH lAC=l ?=IJ EnLolLEnC = FolOmoHFDE? JOFA ?onLAHJI onA polyname EnJo
=noJDAH.
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*.
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.
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.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;
};
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@.
!
void
main()
{
int a, c;
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.
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@.
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 ;
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.
$
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;
}
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;
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.
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.
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;
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";
allocation−statement:
alloc alloclist ;
unalloc alloclist ;
alloclist:
expression
alloclist , expression
alloc a, p, *p;
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@.
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.
prog: decllist
decllist :
| decllist decl
zargs :
| ’(’ arglist ’)’
ztname : tname
| AGGR
| ADT
| UNION
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
zinit :
| ’=’ zelist
!#
zelist : zexpr
| ’[’ expr ’]’ expr
| ’.’ stag expr
| ’{’ zelist ’}’
| ’[’ expr ’]’ ’{’ zelist ’}’
| zelist ’,’ zelist
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
slist :
| slist stmnt
ctlist :
| ctlist tcase
clist :
| clist case
rbody : stmnt
| IDENTIFIER block
zlab :
| IDENTIFIER
stmnt : nlstmnt
| IDENTIFIER ’:’ stmnt
info :
| ’,’ STRING_CONST
zconst :
| CONSTANT
zexpr :
| expr
expr : castexpr
| 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
stag : IDENTIFIER
| TYPENAME
zarlist :
| elist
elist : expr
| elist ’,’ expr
tlist : typecast
| typecast ’,’ 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