lark file
This commit is contained in:
+132
-15
@@ -1,21 +1,138 @@
|
|||||||
// tcl.lark
|
start: script
|
||||||
// sehr vereinfachtes Beispiel – für volle Abdeckung musst du die offizielle TCL-Spec implementieren
|
|
||||||
|
|
||||||
?start: script
|
script: statement*
|
||||||
|
|
||||||
script: stmt*
|
statement: declaracion_funcion modulo_ppal
|
||||||
stmt: command ";"? -> cmd
|
|
||||||
| newline -> empty
|
|
||||||
|
|
||||||
command: WORD arg*
|
declaracion_funcion: "proc" IDENTIFICADOR "{" args_funcion "}" "{" cuerpo_funcion "}" declaracion_funcion |
|
||||||
arg: WORD -> bareword
|
args_funcion: "{" IDENTIFICADOR "}" args_funcion |
|
||||||
| STRING -> string
|
|
||||||
| BRACED -> braced
|
|
||||||
|
|
||||||
WORD: /[^\s\{\}";]+/
|
cuerpo_funcion: declaracion cuerpo_funcion | puts cuerpo_funcion | gets ";" cuerpo_funcion | if_funcion cuerpo_funcion
|
||||||
STRING: "\"" /([^"\\]|\\.)*/ "\"" // "…"
|
| for_funcion cuerpo_funcion | while_funcion cuerpo_funcion | switch_funcion cuerpo_funcion
|
||||||
BRACED: "{" /([^{}\\]|\\.)*/ "}" // {…}
|
| 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 WS
|
||||||
|
%ignore COMMENT
|
||||||
Reference in New Issue
Block a user