Blame compiler/parser.mly

Packit bd2e5d
/***********************************************************************/
Packit bd2e5d
/*                                                                     */
Packit bd2e5d
/*                 MLTk, Tcl/Tk interface of OCaml                     */
Packit bd2e5d
/*                                                                     */
Packit bd2e5d
/*    Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis    */
Packit bd2e5d
/*               projet Cristal, INRIA Rocquencourt                    */
Packit bd2e5d
/*            Jacques Garrigue, Kyoto University RIMS                  */
Packit bd2e5d
/*                                                                     */
Packit bd2e5d
/*  Copyright 2002 Institut National de Recherche en Informatique et   */
Packit bd2e5d
/*  en Automatique and Kyoto University.  All rights reserved.         */
Packit bd2e5d
/*  This file is distributed under the terms of the GNU Library        */
Packit bd2e5d
/*  General Public License, with the special exception on linking      */
Packit bd2e5d
/*  described in file ../../../LICENSE.                                */
Packit bd2e5d
/*                                                                     */
Packit bd2e5d
/***********************************************************************/
Packit bd2e5d
Packit bd2e5d
/* $Id$ */
Packit bd2e5d
Packit bd2e5d
%{
Packit bd2e5d
Packit bd2e5d
open Tables
Packit bd2e5d
Packit bd2e5d
%}
Packit bd2e5d
Packit bd2e5d
/* Tokens */
Packit bd2e5d
%token <string> IDENT
Packit bd2e5d
%token <string> STRING
Packit bd2e5d
%token EOF
Packit bd2e5d
Packit bd2e5d
%token LPAREN           /* "(" */
Packit bd2e5d
%token RPAREN           /* ")" */
Packit bd2e5d
%token COMMA            /* "," */
Packit bd2e5d
%token SEMICOLON        /* ";" */
Packit bd2e5d
%token COLON            /* ":" */
Packit bd2e5d
%token QUESTION         /* "?" */
Packit bd2e5d
%token LBRACKET         /* "[" */
Packit bd2e5d
%token RBRACKET         /* "]" */
Packit bd2e5d
%token LBRACE           /* "{" */
Packit bd2e5d
%token RBRACE           /* "}" */
Packit bd2e5d
%token SLASH            /* "/" */
Packit bd2e5d
Packit bd2e5d
%token TYINT            /* "int" */
Packit bd2e5d
%token TYFLOAT          /* "float" */
Packit bd2e5d
%token TYBOOL           /* "bool" */
Packit bd2e5d
%token TYCHAR           /* "char" */
Packit bd2e5d
%token TYSTRING         /* "string" */
Packit bd2e5d
%token LIST             /* "list" */
Packit bd2e5d
Packit bd2e5d
%token AS               /* "as" */
Packit bd2e5d
%token VARIANT          /* "variant" */
Packit bd2e5d
%token WIDGET           /* "widget" */
Packit bd2e5d
%token OPTION           /* "option" */
Packit bd2e5d
%token TYPE             /* "type" */
Packit bd2e5d
%token SEQUENCE         /* "sequence" */
Packit bd2e5d
%token SUBTYPE          /* "subtype" */
Packit bd2e5d
%token FUNCTION         /* "function" */
Packit bd2e5d
%token MODULE           /* "module" */
Packit bd2e5d
%token EXTERNAL         /* "external" */
Packit bd2e5d
%token UNSAFE           /* "unsafe" */
Packit bd2e5d
/* Entry points */
Packit bd2e5d
%start entry
Packit bd2e5d
%type <unit> entry
Packit bd2e5d
Packit bd2e5d
%%
Packit bd2e5d
TypeName:
Packit bd2e5d
   IDENT { String.uncapitalize_ascii $1 }
Packit bd2e5d
 | WIDGET { "widget" }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* Atomic types */
Packit bd2e5d
Type0 :
Packit bd2e5d
    TYINT
Packit bd2e5d
      { Int }
Packit bd2e5d
  | TYFLOAT
Packit bd2e5d
      { Float }
Packit bd2e5d
  | TYBOOL
Packit bd2e5d
      { Bool }
Packit bd2e5d
  | TYCHAR
Packit bd2e5d
      { Char }
Packit bd2e5d
  | TYSTRING
Packit bd2e5d
      { String }
Packit bd2e5d
  | TypeName
Packit bd2e5d
      { UserDefined $1 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* Camltk/Labltk types */
Packit bd2e5d
Type0_5:
Packit bd2e5d
  | Type0 SLASH Type0 { if !Flags.camltk then $1 else $3 }
Packit bd2e5d
  | Type0 { $1 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* with subtypes */
Packit bd2e5d
Type1 :
Packit bd2e5d
    Type0_5
Packit bd2e5d
      { $1 }
Packit bd2e5d
  | TypeName LPAREN IDENT RPAREN
Packit bd2e5d
     { Subtype ($1, $3) }
Packit bd2e5d
  | WIDGET LPAREN IDENT RPAREN
Packit bd2e5d
     { Subtype ("widget", $3) }
Packit bd2e5d
  | OPTION LPAREN IDENT RPAREN
Packit bd2e5d
     { Subtype ("options", $3) }
Packit bd2e5d
  | Type1 AS STRING
Packit bd2e5d
     { As ($1, $3) }
Packit bd2e5d
  | LBRACE Type_list RBRACE
Packit bd2e5d
      { Product $2 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* with list constructors */
Packit bd2e5d
Type2 :
Packit bd2e5d
    Type1
Packit bd2e5d
     { $1 }
Packit bd2e5d
  | Type2 LIST
Packit bd2e5d
     { List $1 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Labeled_type2 :
Packit bd2e5d
    Type2
Packit bd2e5d
      { "", $1 }
Packit bd2e5d
  | IDENT COLON Type2
Packit bd2e5d
      { $1, $3 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* products */
Packit bd2e5d
Type_list :
Packit bd2e5d
    Type2 COMMA Type_list
Packit bd2e5d
      { $1 :: $3 }
Packit bd2e5d
  | Type2
Packit bd2e5d
      { [$1] }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* records */
Packit bd2e5d
Type_record :
Packit bd2e5d
    Labeled_type2 COMMA Type_record
Packit bd2e5d
      { $1 :: $3 }
Packit bd2e5d
  | Labeled_type2
Packit bd2e5d
      { [$1] }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* callback arguments or function results*/
Packit bd2e5d
FType :
Packit bd2e5d
    LPAREN RPAREN
Packit bd2e5d
      { Unit }
Packit bd2e5d
  | LPAREN Type2 RPAREN
Packit bd2e5d
      { $2 }
Packit bd2e5d
  | LPAREN Type_record RPAREN
Packit bd2e5d
      { Record $2 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Type :
Packit bd2e5d
    Type2
Packit bd2e5d
      { $1 }
Packit bd2e5d
  | FUNCTION FType
Packit bd2e5d
      { Function $2 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
SimpleArg:
Packit bd2e5d
    STRING
Packit bd2e5d
      {StringArg $1}
Packit bd2e5d
  | Type
Packit bd2e5d
      {TypeArg ("", $1) }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Arg:
Packit bd2e5d
    STRING
Packit bd2e5d
      {StringArg $1}
Packit bd2e5d
  | Type
Packit bd2e5d
      {TypeArg ("", $1) }
Packit bd2e5d
  | IDENT COLON Type
Packit bd2e5d
      {TypeArg ($1, $3)}
Packit bd2e5d
  | QUESTION IDENT COLON LBRACKET SimpleArgList RBRACKET DefaultList
Packit bd2e5d
      {OptionalArgs ( $2, $5, $7 )}
Packit bd2e5d
  | QUESTION WIDGET COLON LBRACKET SimpleArgList RBRACKET DefaultList
Packit bd2e5d
      {OptionalArgs ( "widget", $5, $7 )}
Packit bd2e5d
  | QUESTION IDENT COLON LBRACKET SimpleArgList RBRACKET
Packit bd2e5d
      {OptionalArgs ( $2, $5, [] )}
Packit bd2e5d
  | QUESTION WIDGET COLON LBRACKET SimpleArgList RBRACKET
Packit bd2e5d
      {OptionalArgs ( "widget", $5, [] )}
Packit bd2e5d
  | WIDGET COLON Type
Packit bd2e5d
      {TypeArg ("widget", $3)}
Packit bd2e5d
  | Template
Packit bd2e5d
      { $1 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
SimpleArgList:
Packit bd2e5d
    SimpleArg SEMICOLON SimpleArgList
Packit bd2e5d
       { $1 :: $3}
Packit bd2e5d
  | SimpleArg
Packit bd2e5d
      { [$1] }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
ArgList:
Packit bd2e5d
    Arg SEMICOLON ArgList
Packit bd2e5d
       { $1 :: $3}
Packit bd2e5d
  | Arg
Packit bd2e5d
      { [$1] }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
/* DefaultList Only one TypeArg in ArgList and it must be unlabeled */
Packit bd2e5d
DefaultList :
Packit bd2e5d
    LBRACKET LBRACE ArgList RBRACE RBRACKET
Packit bd2e5d
      {$3}
Packit bd2e5d
Packit bd2e5d
/* Template */
Packit bd2e5d
Template :
Packit bd2e5d
    LBRACKET ArgList RBRACKET
Packit bd2e5d
      { ListArg $2 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
/* Constructors for type declarations */
Packit bd2e5d
Constructor :
Packit bd2e5d
    IDENT Template
Packit bd2e5d
      {{ component = Constructor;
Packit bd2e5d
         ml_name = $1;
Packit bd2e5d
         var_name = getvarname $1 $2;
Packit bd2e5d
         template = $2;
Packit bd2e5d
         result = Unit;
Packit bd2e5d
         safe = true }}
Packit bd2e5d
  | IDENT LPAREN IDENT RPAREN Template
Packit bd2e5d
      {{ component = Constructor;
Packit bd2e5d
         ml_name = $1;
Packit bd2e5d
         var_name = $3;
Packit bd2e5d
         template = $5;
Packit bd2e5d
         result = Unit;
Packit bd2e5d
         safe = true }}
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
AbbrevConstructor :
Packit bd2e5d
    Constructor
Packit bd2e5d
      { Full $1 }
Packit bd2e5d
 |  IDENT
Packit bd2e5d
      { Abbrev $1 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Constructors :
Packit bd2e5d
  Constructor Constructors
Packit bd2e5d
   { $1 :: $2 }
Packit bd2e5d
| Constructor
Packit bd2e5d
   { [$1] }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
AbbrevConstructors :
Packit bd2e5d
  AbbrevConstructor AbbrevConstructors
Packit bd2e5d
   { $1 :: $2 }
Packit bd2e5d
| AbbrevConstructor
Packit bd2e5d
   { [$1] }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Safe:
Packit bd2e5d
   /* */
Packit bd2e5d
  { true }
Packit bd2e5d
 | UNSAFE
Packit bd2e5d
  { false }
Packit bd2e5d
Packit bd2e5d
Command :
Packit bd2e5d
   Safe FUNCTION FType IDENT Template
Packit bd2e5d
     {{component = Command; ml_name = $4; var_name = "";
Packit bd2e5d
       template = $5; result = $3; safe = $1 }}
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
External :
Packit bd2e5d
  Safe EXTERNAL IDENT STRING
Packit bd2e5d
     {{component = External; ml_name = $3; var_name = "";
Packit bd2e5d
       template = StringArg $4; result = Unit; safe = $1}}
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
Option :
Packit bd2e5d
   OPTION IDENT Template
Packit bd2e5d
     {{component = Constructor; ml_name = $2; var_name = getvarname $2 $3;
Packit bd2e5d
       template = $3; result = Unit; safe = true }}
Packit bd2e5d
   /* Abbreviated */
Packit bd2e5d
|   OPTION IDENT LPAREN IDENT RPAREN Template
Packit bd2e5d
     {{component = Constructor; ml_name = $2; var_name = $4;
Packit bd2e5d
       template = $6; result = Unit; safe = true }}
Packit bd2e5d
   /* Abbreviated */
Packit bd2e5d
|  OPTION IDENT
Packit bd2e5d
     { retrieve_option $2 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
WidgetComponents :
Packit bd2e5d
  /* */
Packit bd2e5d
  { [] }
Packit bd2e5d
 | Command WidgetComponents
Packit bd2e5d
  { $1 :: $2 }
Packit bd2e5d
 | Option WidgetComponents
Packit bd2e5d
  { $1 :: $2 }
Packit bd2e5d
 | External WidgetComponents
Packit bd2e5d
  { $1 :: $2 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
ModuleComponents :
Packit bd2e5d
  /* */
Packit bd2e5d
  { [] }
Packit bd2e5d
 | Command ModuleComponents
Packit bd2e5d
  { $1 :: $2 }
Packit bd2e5d
 | External ModuleComponents
Packit bd2e5d
  { $1 :: $2 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
ParserArity :
Packit bd2e5d
  /* */
Packit bd2e5d
  { OneToken }
Packit bd2e5d
 | SEQUENCE
Packit bd2e5d
  { MultipleToken }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
ModuleName :
Packit bd2e5d
   IDENT
Packit bd2e5d
  { $1 }
Packit bd2e5d
 | STRING
Packit bd2e5d
  { $1 }
Packit bd2e5d
;
Packit bd2e5d
Packit bd2e5d
entry :
Packit bd2e5d
  TYPE ParserArity TypeName LBRACE Constructors RBRACE
Packit bd2e5d
    { enter_type $3 $2 $5 }
Packit bd2e5d
| VARIANT TYPE ParserArity TypeName LBRACE Constructors RBRACE
Packit bd2e5d
    { enter_type $4 $3 $6 ~variant: true }
Packit bd2e5d
| TYPE ParserArity TypeName EXTERNAL
Packit bd2e5d
    { enter_external_type $3 $2 }
Packit bd2e5d
| SUBTYPE ParserArity OPTION LPAREN ModuleName RPAREN LBRACE AbbrevConstructors RBRACE
Packit bd2e5d
    { enter_subtype "options" $2 $5 $8 }
Packit bd2e5d
| SUBTYPE ParserArity TypeName LPAREN IDENT RPAREN LBRACE AbbrevConstructors RBRACE
Packit bd2e5d
    { enter_subtype $3 $2 $5 $8 }
Packit bd2e5d
| Command
Packit bd2e5d
    { enter_function $1 }
Packit bd2e5d
| WIDGET ModuleName LBRACE WidgetComponents RBRACE
Packit bd2e5d
    { enter_widget $2 $4 }
Packit bd2e5d
| MODULE ModuleName LBRACE ModuleComponents RBRACE
Packit bd2e5d
    { enter_module (String.uncapitalize_ascii $2) $4 }
Packit bd2e5d
| EOF
Packit bd2e5d
    { raise End_of_file }
Packit bd2e5d
;