lark file
This commit is contained in:
+132
-15
@@ -1,21 +1,138 @@
|
||||
// tcl.lark
|
||||
// sehr vereinfachtes Beispiel – für volle Abdeckung musst du die offizielle TCL-Spec implementieren
|
||||
start: script
|
||||
|
||||
?start: script
|
||||
script: statement*
|
||||
|
||||
script: stmt*
|
||||
stmt: command ";"? -> cmd
|
||||
| newline -> empty
|
||||
statement: declaracion_funcion modulo_ppal
|
||||
|
||||
command: WORD arg*
|
||||
arg: WORD -> bareword
|
||||
| STRING -> string
|
||||
| BRACED -> braced
|
||||
declaracion_funcion: "proc" IDENTIFICADOR "{" args_funcion "}" "{" cuerpo_funcion "}" declaracion_funcion |
|
||||
args_funcion: "{" IDENTIFICADOR "}" args_funcion |
|
||||
|
||||
WORD: /[^\s\{\}";]+/
|
||||
STRING: "\"" /([^"\\]|\\.)*/ "\"" // "…"
|
||||
BRACED: "{" /([^{}\\]|\\.)*/ "}" // {…}
|
||||
cuerpo_funcion: declaracion cuerpo_funcion | puts cuerpo_funcion | gets ";" cuerpo_funcion | if_funcion cuerpo_funcion
|
||||
| for_funcion cuerpo_funcion | while_funcion cuerpo_funcion | switch_funcion cuerpo_funcion
|
||||
| r_return cuerpo_funcion | agrup ";" cuerpo_funcion |
|
||||
|
||||
if_funcion: inicio_if cuerpo_funcion "}" elseif_funcion
|
||||
elseif_funcion: inicio_elseif cuerpo_funcion "}" elseif_funcion | else_funcion
|
||||
else_funcion: inicio_else cuerpo_funcion "}" |
|
||||
|
||||
switch_funcion: inicio_switch case_funcion "}"
|
||||
case_funcion: inicio_case cuerpo_funcion "}" case2_funcion
|
||||
case2_funcion: inicio_case cuerpo_funcion "}" case2_funcion | default_funcion
|
||||
default_funcion: inicio_default cuerpo_funcion "}" |
|
||||
|
||||
for_funcion: inicio_for cuerpo_loop_func "}"
|
||||
while_funcion: inicio_while cuerpo_loop_func "}"
|
||||
|
||||
cuerpo_loop_func: r_break cuerpo_loop_func | r_continue cuerpo_loop_func | declaracion cuerpo_loop_func
|
||||
| gets ";" cuerpo_loop_func | puts cuerpo_loop_func | r_return cuerpo_loop_func
|
||||
| if_loop_func cuerpo_loop_func | switch_loop_func cuerpo_loop_func | for_funcion cuerpo_loop_func
|
||||
| while_funcion cuerpo_loop_func | agrup ";" cuerpo_loop_func |
|
||||
|
||||
if_loop_func: inicio_if cuerpo_loop_func "}" elseif_loop_func
|
||||
elseif_loop_func: inicio_elseif cuerpo_loop_func "}" elseif_loop_func | else_loop_func
|
||||
else_loop_func: inicio_else cuerpo_loop_func "}" |
|
||||
|
||||
switch_loop_func: inicio_switch case_loop_func "}"
|
||||
case_loop_func: inicio_case cuerpo_loop_func "}" case2_loop_func
|
||||
case2_loop_func: inicio_case cuerpo_loop_func "}" case2_loop_func | default_loop_func
|
||||
default_loop_func: inicio_default cuerpo_loop_func "}" |
|
||||
|
||||
modulo_ppal: declaracion modulo_ppal | r_for modulo_ppal | gets ";" modulo_ppal | r_if modulo_ppal
|
||||
| puts modulo_ppal | r_while modulo_ppal | r_switch modulo_ppal | agrup ";" modulo_ppal |
|
||||
|
||||
r_if: inicio_if cuerpo_inst "}" elseif
|
||||
elseif: inicio_elseif cuerpo_inst "}" elseif | r_else
|
||||
r_else: inicio_else cuerpo_inst "}" |
|
||||
|
||||
r_switch: inicio_switch r_case "}"
|
||||
r_case: inicio_case cuerpo_inst "}" case2
|
||||
case2: inicio_case cuerpo_inst "}" case2 | r_default
|
||||
r_default: inicio_default cuerpo_inst "}" |
|
||||
|
||||
cuerpo_inst: declaracion cuerpo_inst | r_for cuerpo_inst | gets ";" cuerpo_inst | r_if cuerpo_inst
|
||||
| puts cuerpo_inst | r_while cuerpo_inst | r_switch cuerpo_inst | agrup ";" cuerpo_inst |
|
||||
|
||||
r_for: inicio_for cuerpo_loop "}"
|
||||
r_while: inicio_while cuerpo_loop "}"
|
||||
|
||||
cuerpo_loop: declaracion cuerpo_loop | r_for cuerpo_loop | gets ";" cuerpo_loop | if_loop cuerpo_loop
|
||||
| puts cuerpo_loop | r_while cuerpo_loop | switch_loop cuerpo_loop | r_break cuerpo_loop
|
||||
| r_continue cuerpo_loop | agrup ";" cuerpo_loop |
|
||||
|
||||
if_loop: inicio_if cuerpo_loop "}" elseif_loop
|
||||
elseif_loop: inicio_elseif cuerpo_loop "}" elseif_loop | else_loop
|
||||
else_loop: inicio_else cuerpo_loop "}" |
|
||||
|
||||
switch_loop: inicio_switch case_loop "}"
|
||||
case_loop: inicio_case cuerpo_loop "}" case2_loop
|
||||
case2_loop: inicio_case cuerpo_loop "}" case2_loop | default_loop
|
||||
default_loop: inicio_default cuerpo_loop "}" |
|
||||
|
||||
puts: "puts" asignacion ";"
|
||||
gets: "gets" "stdin"
|
||||
declaracion: "set" IDENTIFICADOR indice asignacion ";"
|
||||
|
||||
agrup: "[" aux_agrup
|
||||
aux_agrup: expr "]" | IDENTIFICADOR param_func "]" | gets "]" | "array" aux_array
|
||||
aux_array: "size" IDENTIFICADOR "]" | "exists" IDENTIFICADOR "]"
|
||||
|
||||
param_func: "{" aux_param |
|
||||
aux_param: asignacion "}" param_func | expr "}" param_func
|
||||
|
||||
asignacion: valor | "$" IDENTIFICADOR indice | agrup
|
||||
|
||||
indice: "(" val_indice ")" |
|
||||
val_indice: valor | agrup | "$" IDENTIFICADOR indice
|
||||
|
||||
valor: VALOR_STRING | VALOR_ENTERO | VALOR_DOUBLE
|
||||
|
||||
incremento: VALOR_ENTERO |
|
||||
|
||||
r_break: "break" ";"
|
||||
r_continue: "continue" ";"
|
||||
r_return: "return" value_return ";"
|
||||
value_return: asignacion |
|
||||
|
||||
expr: "expr" "{" expresion "}"
|
||||
asig_for: VALOR_ENTERO | "$" IDENTIFICADOR indice | expr
|
||||
|
||||
inicio_if: "if" "{" expresion "}" "then" "{"
|
||||
inicio_elseif: "elseif" "{" expresion "}" "then" "{"
|
||||
inicio_else: "else" "{"
|
||||
inicio_switch: "switch" "$" IDENTIFICADOR indice "{"
|
||||
inicio_case: "case" VALOR_ENTERO "{"
|
||||
inicio_default: "default" "{"
|
||||
|
||||
inicio_for: "for" "{" dec_for "}" "{" expresion "}" "{" "incr" IDENTIFICADOR incremento "}" "{"
|
||||
dec_for: "set" IDENTIFICADOR asig_for
|
||||
|
||||
inicio_while : "while" "{" expresion "}" "{"
|
||||
|
||||
expresion: exp_or
|
||||
exp_or: exp_or "||" exp_and | exp_and
|
||||
exp_and: exp_and "&&" exp_ig | exp_ig
|
||||
exp_ig: exp_ig op_ig exp_rel | exp_rel
|
||||
exp_rel: exp_rel op_rel exp_add | exp_add
|
||||
exp_add: exp_add op_add exp_mul | exp_mul
|
||||
exp_mul: exp_mul op_mul exp_pot | exp_pot
|
||||
exp_pot: exp_pot "**" exp_una | exp_una
|
||||
exp_una: op_una exp_una | term
|
||||
term: "$" IDENTIFICADOR indice | agrup | valor | "(" exp_or ")"
|
||||
|
||||
op_ig: "eq" | "==" | "ne" | "!="
|
||||
op_rel: ">" | "<" | ">=" | "<="
|
||||
op_add: "+" | "-"
|
||||
op_mul: "*" | "/" | "%"
|
||||
op_una: "-" | "!"
|
||||
|
||||
|
||||
IDENTIFICADOR: /[a-zA-Z_][a-zA-Z0-9_]*/
|
||||
VALOR_ENTERO: /'-'?[0-9]+/
|
||||
VALOR_DOUBLE: /[0-9]+ '.' [0-9]+/
|
||||
VALOR_STRING: /'"' ~[\r\n"]* '"'/
|
||||
COMMENT: /#[^\r\n]*/
|
||||
WS: /[ \t]+/
|
||||
NEWLINE: /\r?\n/
|
||||
|
||||
%import common.NEWLINE -> newline
|
||||
%import common.WS
|
||||
%ignore WS
|
||||
%ignore COMMENT
|
||||
Reference in New Issue
Block a user