Skip to main content

module lang::flybytes::demo::func::Syntax

rascal-0.41.2
org.rascalmpl.flybytes-0.2.10

Usage

import lang::flybytes::demo::func::Syntax;

syntax Ident

lexical Ident =  [a-zA-Z][a-zA-Z0-9]* !>> [a-zA-Z0-9];

syntax Natural

lexical Natural = [0-9]+ !>> [0-9];

syntax LAYOUT

lexical LAYOUT = [\t-\n\r\ ];

syntax LAYOUTLIST

layout LAYOUTLIST = LAYOUT*  !>> [\t-\n\r\ ] ;

syntax Prog

start syntax Prog = prog: Func* ;

syntax Func

syntax Func = func: Ident name "(" {Ident ","}* ")" "=" FExp;

syntax FExp

syntax FExp = let: "let" {Binding ","}* "in" FExp "end"
| cond: "if" FExp "then" FExp "else" FExp "end"
| bracket "(" FExp ")"
| var: Ident
| nat: Natural
| call: Ident "(" {FExp ","}* ")"
> non-assoc (
left mul: FExp "*" FExp
| non-assoc div: FExp "/" FExp
)
> left (
left add: FExp "+" FExp
| left sub: FExp "-" FExp
)
>
non-assoc (
non-assoc gt: FExp "\>" FExp
| non-assoc lt: FExp "\<" FExp
| non-assoc geq: FExp "\>=" FExp
| non-assoc leq: FExp "\<=" FExp
)
>
right assign: Ident ":=" FExp
>
right seq: FExp ";" FExp;

syntax Binding

syntax Binding = binding: Ident "=" FExp;