chronlang_parser/
ast.rs

1use std::ops::Range;
2
3use serde::{Serialize, Deserialize};
4
5pub type Span = Range<usize>;
6pub type Spanned<T> = (Span, T);
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub enum Stmt {
10  SoundChange {
11    source: Spanned<Source>,
12    target: Spanned<Target>,
13    environment: Option<Spanned<Environment>>,
14    description: Option<Spanned<String>>,
15  },
16  Import {
17    path: Vec<Spanned<String>>,
18    absolute: bool,
19    names: Vec<Spanned<String>>,
20  },
21  Language {
22    id: Spanned<String>,
23    parent: Option<Spanned<String>>,
24    name: Option<Spanned<String>>,
25  },
26  Word {
27    gloss: Spanned<String>,
28    pronunciation: Spanned<Vec<String>>,
29    definitions: Vec<Definition>,
30  },
31  Class {
32    label: Spanned<String>,
33    encodes: Vec<Spanned<String>>,
34    annotates: Vec<Spanned<String>>,
35    phonemes: Vec<Spanned<PhonemeDef>>,
36  },
37  Series {
38    label: Spanned<String>,
39    series: Spanned<Series>,
40  },
41  Trait {
42    label: Spanned<String>,
43    members: Vec<Spanned<TraitMember>>,
44  },
45  Milestone {
46    time: Option<Spanned<Time>>,
47    language: Option<Spanned<String>>,
48  }
49}
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52pub enum Source {
53  Pattern(Pattern),
54  Empty,
55}
56#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
57pub enum Target {
58  Modification(Vec<Spanned<Feature>>),
59  Pattern(Pattern),
60  Empty,
61}
62
63#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
64pub enum Feature {
65  Positive(String),
66  Negative(String),
67}
68
69pub type Pattern = Vec<Segment>;
70
71#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
72pub enum Segment {
73  Category(Category),
74  Phonemes(String),
75}
76
77#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78pub struct Category {
79  pub base_class: Option<Spanned<char>>,
80  pub features: Vec<Spanned<Feature>>,
81}
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
84pub struct Environment {
85  pub before: Option<EnvPattern>,
86  pub after: Option<EnvPattern>,
87}
88
89pub type EnvPattern = Vec<EnvElement>;
90
91#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
92pub enum EnvElement {
93  Segment(Segment),
94  SyllableBoundary,
95  WordBoundary,
96}
97
98#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
99pub struct Definition {
100  pub pos: Option<Spanned<String>>,
101  pub definition: Spanned<String>,
102}
103
104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
105pub enum Series {
106  Category(Category),
107  List(Vec<Spanned<String>>),
108}
109
110#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
111pub struct PhonemeDef {
112  pub label: Spanned<String>,
113  pub traits: Vec<Spanned<String>>,
114}
115
116#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
117pub struct TraitMember {
118  pub labels: Vec<Spanned<String>>,
119  pub notation: Option<Spanned<String>>,
120  pub default: bool,
121}
122
123#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
124pub enum Time {
125  Instant(i64),
126  Range(i64, i64),
127}
128