Professional Documents
Culture Documents
----
/* antes de parsear se prepara la entrada:
- reduciendo todas las newline a una: s/\nl+/\nl/g
- reduciendo todos los espacios a uno: s/ +/ /g
*/
digito: charset "0123456789"
letra: charset [#"a" - #"z" #"A" - #"Z"]
especial: charset "-"
chars: union especial union digito letra
c: [ "t" | "f" ]
s: ["a" | "b" ]
ssep: charset reduce [";" newline]
sq: [ s opt [ssep sq]]
bdef: charset reduce [":" newline]
b: [opt bdef sq opt ssep]
ifr: ["if" c "then" b opt ["else" b] "."]
prog: [b "."]
; como no se pueden usar tipos parseando strings hay que usar reglas
; param: [string! opt ["," param]]
; proc: ["para" string! opt ["con" param] b "."]
param: [id opt ["," param]]
id: [some [chars]]
proc: ["para" id opt ["con" param] b "."]
/*
expr: [term ["+" | "-"] expr | term]
term: [factor ["*" | "/"] term | factor]
factor: [primary "**" factor | primary]
primary: [some digit | "(" expr ")"]
digit: charset "0123456789"
*/
; aplicando algunas transformaciones se puede simplificar la gramatica
; - reducir multiples " " a uno
; - reducir multiples newline a una
; - reducir " ;" a ";"
; - reducir "; " a ";"
; - reducir " :" a ":"
; - reducir ": " a ":"
; - reducir " ." a "."