let basic = `
%%
E
: E PLUS T
| T
;
T
: ZERO
;
`
let calc = `
%lex
%%
\s+ /* skip whitespace */
[0-9]+("."[0-9]+)?\b return 'NUMBER'
"*" return '*'
"/" return '/'
"-" return '-'
"+" return '+'
"^" return '^'
"!" return '!'
"%" return '%'
"(" return '('
")" return ')'
"PI" return 'PI'
"E" return 'E'
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
/* operator associations and precedence */
%left '+' '-'
%left '*' '/'
%left '^'
%right '!'
%right '%'
%left UMINUS
%start expressions
%% /* language grammar */
expressions
: e EOF
{ typeof console !== 'undefined' ? console.log($1) : print($1);
return $1; }
;
e
: e '+' e
{$ = $1+$3;}
| e '-' e
{$ = $1-$3;}
| e '*' e
{$ = $1*$3;}
| e '/' e
{$ = $1/$3;}
| e '^' e
{$ = Math.pow($1, $3);}
| e '!'
{{
$ = (function fact (n) { return n==0 ? 1 : fact(n-1) * n })($1);
}}
| e '%'
{$ = $1/100;}
| '-' e %prec UMINUS
{$ = -$2;}
| '(' e ')'
{$ = $2;}
| NUMBER
{$ = Number(yytext);}
| E
{$ = Math.E;}
| PI
{$ = Math.PI;}
;
`
let classy = `
/* description: ClassyLang grammar. Very classy. */
/*
To build parser:
$ ./bin/jison examples/classy.jison examples/classy.jisonlex
*/
/* author: Zach Carter */
%right ASSIGN
%left OR
%nonassoc EQUALITY GREATER
%left PLUS MINUS
%left TIMES
%right NOT
%left DOT
%%
pgm
: cdl MAIN LBRACE vdl el RBRACE ENDOFFILE
;
cdl
: c cdl
|
;
c
: CLASS id EXTENDS id LBRACE vdl mdl RBRACE
;
vdl
: VAR t id SEMICOLON vdl
|
;
mdl
: t id LPAREN t id RPAREN LBRACE vdl el RBRACE mdl
|
;
t
: NATTYPE
| id
;
id
: ID
;
el
: e SEMICOLON el
| e SEMICOLON
;
e
: NATLITERAL
| NUL
| id
| NEW id
| THIS
| IF LPAREN e RPAREN LBRACE el RBRACE ELSE LBRACE el RBRACE
| FOR LPAREN e SEMICOLON e SEMICOLON e RPAREN LBRACE el RBRACE
| READNAT LPAREN RPAREN
| PRINTNAT LPAREN e RPAREN
| e PLUS e
| e MINUS e
| e TIMES e
| e EQUALITY e
| e GREATER e
| NOT e
| e OR e
| e DOT id
| id ASSIGN e
| e DOT id ASSIGN e
| id LPAREN e RPAREN
| e DOT id LPAREN e RPAREN
| LPAREN e RPAREN
;
`
let lambda = `
%lex
%%
\s*\n\s* {/* ignore */}
"(" { return '('; }
")" { return ')'; }
"^"|"λ" { return 'LAMBDA'; }
"."\s? { return '.'; }
[a-zA-Z] { return 'VAR'; }
\s+ { return 'SEP'; }
<<EOF>> { return 'EOF'; }
/lex
%right LAMBDA
%left SEP
%%
file
: expr EOF
{ return $expr; }
;
expr
: LAMBDA var_list '.' expr
%{
var temp = ["LambdaExpr", $var_list.shift(), $expr];
$var_list.forEach(function (v) {
temp = ["LambdaExpr", v, temp];
});
$ = temp;
%}
| expr SEP expr
{ $ = ["ApplyExpr", $expr1, $expr2]; }
| var
{ $ = ["VarExpr", $var]; }
| '(' expr ')'
{ $ = $expr; }
;
var_list
: var_list var
{ $ = $var_list; $.unshift($var); }
| var
{ $ = [$var]; }
;
var
: VAR
{ $ = yytext; }
;
`
let prec = `
%lex
%%
\s+ {/* skip whitespace */}
[0-9]+ {return 'NAT';}
"+" {return '+';}
"*" {return '*';}
<<EOF>> {return 'EOF';}
/lex
%left '+'
%left '*'
%%
S
: e EOF
{return $1;}
;
e
: e '+' e
{$ = [$1,'+', $3];}
| e '*' e
{$ = [$1, '*', $3];}
| NAT
{$ = parseInt(yytext);}
;
`
module.exports = { lambda, prec, basic, calc, classy }