%class dlp_yacc include <ml/dlp/yacc.h> define YYDEBUG 1 static in_obj = 0; %start top %defaults -- OP ROP PRE POS SPEC DECL QUAL STOP COMM ATOM END MODE META %token INT STRING NECK
top: program { $$ = $1; } program : /* empty */ { $$ = mkterm("#empty:"); } | program any { $$ = mkterm("#;:",$1,$2); } | program error { $2 = mkterm("#error:", mkterm(_error)); } any { term* err = mkterm(strof($4)); term* msg = $2; $$ = mkterm("#;:",$1,mkterm("#error:",err,msg)); } ; any : item { if (!in_obj) return $1; }
specifier: SPEC | QUAL SPEC { $$ = mkterm("#qual:",$1,$2); } | COMM specifier { $$ = $2; } ; object: specifier term begin { in_obj++; } program end { in_obj--; term* name = $2; term* header = mkterm("#object:",name); term* end = mkterm("#end:",$5,name); $$ = mkterm("#;:",header,end); } | specifier term ':' slist begin { in_obj++; } program end { in_obj--; term* name = $2; term* header = mkterm("#object:",name,$4); term* end = mkterm("#end:",$7,name); $$ = mkterm("#;:",header,end); } ; stop: '.' | STOP; begin: '{' | stop; end: '}' | END | END term stop { $$ = $2; } ;
items: item | items item { $$ = mkterm("#;:",$1,$2); } ; item : command { $$ = mkterm("#item:",$1); } | clause { $$ = mkterm("#item:",$1);} | declarative { $$ = mkterm("#item:",$1); } | object { $$ = mkterm("#item:",$1); } ; clause : fact | rule ; declarative : DECL clist stop { $$ = mkterm("#declare:",$1,$2); } | COMM DECL clist stop { $$ = mkterm("#declare:",$2,$3); } ; command : COMM clist stop { $$ = mkterm("#command:",$2); } ; fact : term stop { $$ = mkterm("#fact:",$1); } ; rule : term COMM literals stop { $$ = mkterm("#rule:",$1,$3); } ;
term : con | fun | expr; con: '!' | ATOM | STRING ; fun: ATOM alist { $$ = mkterm(strof($1),$2); } | ATOM '(' ')' { $$ = $1; } ; literal: term { $$ = mkterm("#literal:",$1); /* for layout! */ } ; literals : literal | literals ',' literal { $$ = mkterm("#,:",$1,$3); } ;
vlist: alist | clist ; alist : '(' clist ')' { $$ = $2; } ; clist : term | clist ',' term { $$ = mkterm("#,:",$1,$3); } ; slist : term | slist ',' term { $$ = mkterm("#::",$1,$3); } ; lexpr : '[' ']' { $$ = mkterm("[]"); } | '[' list { $$ = mkterm("#list:",$2); } ; list : term ']' { $$ = mkterm(".",$1,mkterm("[]")); } | term '|' term ']' { $$ = mkterm("|",$1,$3); } | term ',' list { $$ = mkterm(".",$1,$3); } ; sexpr : '{' '}' { $$ = mkterm("{}"); } | '{' set { $$ = mkterm("#set:",$2); } ; set : term '}' { $$ = mkterm("#s.:",$1); } | term '|' clist '}' { $$ = mkterm("#s|:",$1,$3); } | term ',' set { $$ = mkterm("#s,:",$1,$3); } ;
bexpr : '(' ')' { $$ = mkterm("()"); } | '(' term ')' { $$ = $2; } | '{' '}' { $$ = mkterm("{}");; } | '{' term '}' { $$ = mkterm("{}",$2); } | '(' term COMM clist ')' { $$ = mkterm(strof($3),$2,$4); } | '(' term '.' term ')' { $$ = mkterm("#dot:",$2,$4); } ; expr : bexpr | lexpr | sexpr | EXPR { /* from defaults */} ;
defaults: OP EXPR SPEC QUAL MODE META STOP COMM ATOM END
Hush Online Technology
hush@cs.vu.nl
09/09/98 |
![]() |
![]() |