retur
voidyyerrorco
stchars语法开始符号的定义%start非终结符注:若没有上述说明,YACC自动将第一条语法规则左部的非终结符作为语法开始符。语义值类型的定义u
io
定义语义值的类型u
io
TreeNodet
odeToke
Typetoktype定义文法符号的语义值类型typet
odeprogramdeclaratio
_listdeclaratio
var_declaratio
typet
odefu
_declaratio
paramsparam_listparamcompou
d_stmttypet
odelocal_declaratio
sstateme
t_liststateme
ttypet
odeexpressio
_stmtselectio
_stmtiteratio
_stmttypet
oderetur
_stmtexpressio
varsimple_expressio
typet
odeadditive_expressio
termfactorcallargsarg_listtypetoktype_specifierrelopaddopmuloptoke
在定义终结符号时也可以定义语义值类型。终结符的定义toke
语义值类型终结符名编号toke
DIGITLETTERtoke
BEGIN100
f注:
1非终结符不需要特别说明,如果需要说明语义值类型则用%type语句;2文字字符终结符不需要特别说明,它们的编号取其在字符集中的值;3在规则中出现文字字符时用单引号括起来。
toke
ENDFILEERRORtoke
IFELSEINTRETURNVOIDWHILEtoke
IDNUMtoke
ASSIGNtoke
EQNOTEQLTEQGTEQLTGTtoke
PLUSMINUSTIMESOVERtoke
LPARENRPARENLBRACKRBRACKLCURLRCURLtoke
SEMICOMMA运算符优先级和结合性的定义以%left和%right定义结合性;以排列顺序定义优先级;在语法规则中,以%prec辅助定义优先级消除二义性的两条规则:1出现移进归约冲突时,进行移进;2出现归约归约冲突时,用先出现的规则进行归约;statIFbexpTHENstatIFbexpTHENstatELSEstat用结合性和优先级解决冲突;规则的结合性就是规则右部最后一个非终结符的优先级和结合性;如果使用了%prec子句,则优先级和结合性由%prec子句决定;对于无优先级和结合性的规则,用规则1、2解决;对于有优先级和结合行的规则,用如下的规则解决:出现移进归约冲突时,输入符号的优先级大于规则的优先级则移进,若输入符号的优先级小于规则的优先级则归约,若二者的优先级相同,左结合则归约,右结合则移进,无结合则出错。
二.语法规则
programdeclaratio
_listparseTree1YYACCEPTdeclaratio
_listdeclaratio
_listdeclaratio
TreeNodet1iftNULL
fwhiletsibli
gNULLtTreeNodetsibli
gtsibli
g21else2declaratio
1var_declaratio
1fu
_declaratio
1程序由声明的列表或序列组成,声明可以是函数或变量声明,顺序是任意的。至少必须有一个声明。接下来是语义限制这些在C中不会出现。所有的变量和函数在r