gioser

tawasuyu/brahman

Rust 476TOML 190Markdown 50JSON 176602 Definiciones

⎇ 71a4068d12e81d0be7b08d0717114dd5b10868fe crates/modules/charka/charka-ir/src/kw.rs Rust · 101 líneas · 2.5 KB Historia Quién tocó qué crudo

feat(charka): charka-ir — representación intermedia con statements tipados 71a4068d1 · sergio ·

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}