The DejaVU Framework -- hush 3.0
[.] Papers Tutorials Examples Manuals Interfaces Sources Packages Resources ?

parser: yacc.y hush-3.0b4/api/grammar/examples/dlp


[.] - [up] [top] - index README C++ make include source logic grammar scripts
  

dlp_yacc


  %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 
  
  

slide: dlp_yacc


the rules -- precedences are also default


  
  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; }
  
  

slide: the rules -- precedences are also default


objects are indicated by specifiers


  
  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; }
     ;
  
  

slide: objects are indicated by specifiers


items are the things a program is made of


  
  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); } ;
  
  

slide: items are the things a program is made of


terms are the glue of logic programming


  
  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); }
           ;
  
  

slide: terms are the glue of logic programming


lists are tricky though


  
  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); }
        ;
  
  

slide: lists are tricky though


finally, the expressions -- remember the defaults


  
  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 */} ;
  
  

slide: finally, the expressions -- remember the defaults

  
  
defaults: OP EXPR SPEC QUAL MODE META STOP COMM ATOM END
[.] Papers Tutorials Examples Manuals Interfaces Sources Packages Resources ?
Hush Online Technology
hush@cs.vu.nl
09/09/98