⎇ 71a4068d12e81d0be7b08d0717114dd5b10868fe
crates/modules/charka/charka-ir/src/kw.rs
Historia
Quién tocó qué
crudo
feat(charka): charka-ir — representación intermedia con statements tipados
1//! Predicados sobre las palabras clave de COBOL. COBOL no termina los
2//! statements con un símbolo: una sentencia es una secuencia de
3//! statements que se delimitan por la aparición del siguiente verbo.
4//! Estos predicados le dicen al parser dónde corta un statement.
5
6/// ¿Es `w` un verbo que inicia un statement? (En mayúsculas.)
7pub(crate) fn is_verb(w: &str) -> bool {
8 matches!(
9 w,
10 "ACCEPT"
11 | "ADD"
12 | "ALTER"
13 | "CALL"
14 | "CANCEL"
15 | "CLOSE"
16 | "COMPUTE"
17 | "CONTINUE"
18 | "DELETE"
19 | "DISPLAY"
20 | "DIVIDE"
21 | "EVALUATE"
22 | "EXIT"
23 | "GO"
24 | "GOBACK"
25 | "IF"
26 | "INITIALIZE"
27 | "INSPECT"
28 | "MERGE"
29 | "MOVE"
30 | "MULTIPLY"
31 | "OPEN"
32 | "PERFORM"
33 | "READ"
34 | "RELEASE"
35 | "RETURN"
36 | "REWRITE"
37 | "SEARCH"
38 | "SET"
39 | "SORT"
40 | "START"
41 | "STOP"
42 | "STRING"
43 | "SUBTRACT"
44 | "UNSTRING"
45 | "WRITE"
46 )
47}
48
49/// ¿Es `w` un terminador de ámbito (`END-IF`, `ELSE`, `WHEN`...)?
50pub(crate) fn is_terminator(w: &str) -> bool {
51 matches!(
52 w,
53 "ELSE"
54 | "WHEN"
55 | "END-IF"
56 | "END-PERFORM"
57 | "END-EVALUATE"
58 | "END-ADD"
59 | "END-SUBTRACT"
60 | "END-MULTIPLY"
61 | "END-DIVIDE"
62 | "END-COMPUTE"
63 | "END-READ"
64 | "END-WRITE"
65 | "END-CALL"
66 | "END-STRING"
67 | "END-UNSTRING"
68 | "END-SEARCH"
69 | "END-START"
70 | "END-DELETE"
71 | "END-REWRITE"
72 | "END-RETURN"
73 )
74}
75
76/// ¿Es `w` una palabra de conexión de una cláusula (`TO`, `GIVING`...)?
77fn is_connector(w: &str) -> bool {
78 matches!(
79 w,
80 "TO" | "FROM"
81 | "GIVING"
82 | "BY"
83 | "INTO"
84 | "THRU"
85 | "THROUGH"
86 | "UNTIL"
87 | "TIMES"
88 | "ROUNDED"
89 | "THEN"
90 | "WITH"
91 | "UPON"
92 | "REMAINDER"
93 | "VARYING"
94 )
95}
96
97/// ¿Marca `w` el final de una lista de operandos o de nombres? Es así
98/// para todo verbo, terminador o conector — ninguno puede ser un dato.
99pub(crate) fn is_boundary(w: &str) -> bool {
100 is_verb(w) || is_terminator(w) || is_connector(w)
101}