diff options
Diffstat (limited to 'ipl/packs/euler/euler.grm')
-rw-r--r-- | ipl/packs/euler/euler.grm | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/ipl/packs/euler/euler.grm b/ipl/packs/euler/euler.grm new file mode 100644 index 0000000..80f5b25 --- /dev/null +++ b/ipl/packs/euler/euler.grm @@ -0,0 +1,99 @@ +start : program . +program = block ENDPROG!. +vardecl = new id NEWDECL! . +fordecl = formal id FORMALDECL! . +labdecl = label id LABELDECL! . +var = id VARID! { "[" expr "]" SUBSCR! | "." DOT! } . +logval = true LOGVALTRUE! . +logval = false LOGVALFALSE! . +number = realN | integerN. +reference = "@" var REFERENCE! . +# listhead -> "(" LISTHD1! +# listhead -> listhead expr "," LISTHD2! +# listN -> listhead ")" LISTN1! +# listN -> listhead expr ")" LISTN2! +listN = "(" LISTHD1! ( ")" LISTN1! | expr listTl ) . +listTl = ")" LISTN2! | "," LISTHD2! ( expr listTl | ")" LISTN1! ) . +prochead = "'" PROCHD! { fordecl ";" PROCFORDECL! } . +procdef = prochead expr "'" PROCDEF! . +primary = var ( listN CALL! | VALUE!) | primary1 . +primary1 = logval LOADLOGVAL! | number LOADNUM! | + symbol LOADSYMB!| reference | + listN | tail primary UOP! | procdef | + undef LOADUNDEF! | "[" expr "]" PARENS! | in INPUT! | + isb var UOP! | isn var UOP! | isr var UOP! | + isl var UOP! | isli var UOP! | isy var UOP! | + isp var UOP! | isu var UOP! | abs primary UOP! | + length var UOP! | integer primary UOP! | + real primary UOP! | logical primary UOP! | list primary UOP! . +factor = primary factortail. +factortail = { "**" primary BOP! } . +term = factor termtail. +termtail = { "*" factor BOP! | "/" factor BOP! | + div factor BOP! | mod factor BOP! } . +sum = ("+" term UPLUS! | "-" term NEG! | term) sumtail. +sumtail = { "+" term BOP! | "-" term BOP! } . +choice = sum choicetail. +choicetail = { min sum BOP! | max sum BOP! } . + +relation = choice relationtail. +relationtail = [ "=" choice BOP! | "~=" choice BOP! + | "<" choice BOP! | "<=" choice BOP! + | ">" choice BOP! | ">=" choice BOP! ] . + +negation = "~" relation UOP! | relation . +conj = negation conjtail. +conjtail = [ and CONJHD! conj CONJ! ]. +disj = conj disjtail. +disjtail = [ or DISJHD! disj DISJ! ] . +catenatail = { "&" primary BOP! }. + +truepart = expr else TRUEPT! . +ifclause = if expr then IFCLSE! . + +expr = var exprtail | expr1. +exprtail = "<-" expr BOP! | + ( listN CALL! | VALUE!) + factortail + termtail + sumtail + choicetail + relationtail + conjtail + disjtail + catenatail . + +expr1 = block . +expr1 = ifclause truepart expr IFEXPR! . +expr1 = goto primary UOP! . +expr1 = out expr UOP! . +expr1 = primary1 + factortail + termtail + sumtail + choicetail + relationtail + conjtail + disjtail + catenatail . + +expr1 = ( "+" term UPLUS! | "-" term NEG! ) + sumtail + choicetail + relationtail + conjtail + disjtail + catenatail . + +expr1 = "~" relation UOP! conjtail disjtail catenatail . + + +stat = expr1 + | id ( ":" LABDEF! stat LABSTMT! + | VARID! { "[" expr "]" SUBSCR! | "." DOT! } + exprtail ) . + +block = begin BEGIN! + { vardecl ";" BLKHD! | labdecl ";" BLKHD!} + stat { ";" BLKBODY! stat } end BLK! . + |