grammars

node v10.24.1
version: 1.0.0
endpointsharetweet
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 }
Loading…

no comments

    sign in to comment