aboutsummaryrefslogtreecommitdiff
path: root/src/bin/gen.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-01-01 15:58:46 +0000
committerAleksey Kladov <[email protected]>2018-01-01 15:58:46 +0000
commitcb362626f326a565aca34c1a11c95dcb7152b798 (patch)
tree5a1cc081e36b4061f8e9275db9bf14ed71e924f9 /src/bin/gen.rs
parent0af33a2587e4fb96e5001492792f1e926d576e27 (diff)
Parser: guess what? Groundwork!
Diffstat (limited to 'src/bin/gen.rs')
-rw-r--r--src/bin/gen.rs19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/bin/gen.rs b/src/bin/gen.rs
index f5a66d9f2..9d7f7e389 100644
--- a/src/bin/gen.rs
+++ b/src/bin/gen.rs
@@ -17,6 +17,7 @@ fn main() {
17 17
18#[derive(Deserialize)] 18#[derive(Deserialize)]
19struct Grammar { 19struct Grammar {
20 keywords: Vec<String>,
20 tokens: Vec<String>, 21 tokens: Vec<String>,
21 nodes: Vec<String>, 22 nodes: Vec<String>,
22} 23}
@@ -33,8 +34,10 @@ impl Grammar {
33 acc.push_str("use tree::{SyntaxKind, SyntaxInfo};\n"); 34 acc.push_str("use tree::{SyntaxKind, SyntaxInfo};\n");
34 acc.push_str("\n"); 35 acc.push_str("\n");
35 36
36 let syntax_kinds: Vec<&String> = 37 let syntax_kinds: Vec<String> =
37 self.tokens.iter().chain(self.nodes.iter()) 38 self.keywords.iter().map(|kw| kw_token(kw))
39 .chain(self.tokens.iter().cloned())
40 .chain(self.nodes.iter().cloned())
38 .collect(); 41 .collect();
39 42
40 for (idx, kind) in syntax_kinds.iter().enumerate() { 43 for (idx, kind) in syntax_kinds.iter().enumerate() {
@@ -60,6 +63,14 @@ impl Grammar {
60 63
61 acc.push_str("pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo {\n"); 64 acc.push_str("pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo {\n");
62 acc.push_str(" &INFOS[kind.0 as usize]\n"); 65 acc.push_str(" &INFOS[kind.0 as usize]\n");
66 acc.push_str("}\n\n");
67 acc.push_str("pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {\n");
68 acc.push_str(" match ident {\n");
69 for kw in self.keywords.iter() {
70 write!(acc, " {:?} => Some({}),\n", kw, kw_token(kw)).unwrap();
71 }
72 acc.push_str(" _ => None,\n");
73 acc.push_str(" }\n");
63 acc.push_str("}\n"); 74 acc.push_str("}\n");
64 acc 75 acc
65 } 76 }
@@ -77,4 +88,8 @@ fn generated_file() -> PathBuf {
77 88
78fn scream(word: &str) -> String { 89fn scream(word: &str) -> String {
79 word.chars().map(|c| c.to_ascii_uppercase()).collect() 90 word.chars().map(|c| c.to_ascii_uppercase()).collect()
91}
92
93fn kw_token(keyword: &str) -> String {
94 format!("{}_KW", scream(keyword))
80} \ No newline at end of file 95} \ No newline at end of file