From 9fe2202b8ba2d134349985d1bc8157b3f38bd430 Mon Sep 17 00:00:00 2001 From: christoph_xd Date: Sat, 19 Jul 2025 20:51:36 +0200 Subject: [PATCH] lark file --- server/src/parser/tcl.lark | 147 +++++++++++++++++++++++++++++++++---- 1 file changed, 132 insertions(+), 15 deletions(-) diff --git a/server/src/parser/tcl.lark b/server/src/parser/tcl.lark index 3674b1b..2bea195 100644 --- a/server/src/parser/tcl.lark +++ b/server/src/parser/tcl.lark @@ -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 \ No newline at end of file