Source

ocaml-pkgbuild / expy.mly

%{

open Pbparams

let retrieve = Pbparams.param_string
let assign   = Pbparams.assign_string

%}

%token <string> RAWTEXT
%token <string> IDENT
%token SIGIL SOPEN SCLOSE
%token SUBDEF SUBSET SUBERR
%token EOF

%start pbexp
%type <string> pbexp

%%

pbexp:
| param pbexp   { $1 ^ $2 }
| text  pbexp   { $1 ^ $2 }
|               { "" }
| EOF           { "" }

param:
| SIGIL pname        { try retrieve $2 with Not_found -> "" }
| SOPEN pname SCLOSE { try retrieve $2 with Not_found -> "" }
| SOPEN pname SUBDEF pbexp SCLOSE
    { try retrieve $2 with Not_found -> $4 }
| SOPEN pname SUBSET pbexp SCLOSE
    { try retrieve $2
      with Not_found ->
        assign $2 $4 ;
        retrieve $2
    }
| SOPEN pname SUBERR pbexp SCLOSE
    { try retrieve $2 with Not_found -> failwith $4 }

text:
| RAWTEXT { $1   }
| SUBDEF  { ":-" (* Convert meta-chars in wrong place back to text *) }
| SUBSET  { ":=" (* All ways around this problem seem hackish. *)     }
| SUBERR  { ":?" (* Owell... *) }

pname:
| IDENT { $1 }
| param { $1 }

%%
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.