summaryrefslogtreecommitdiff
path: root/src/compiler/compiler.lm
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/compiler.lm')
-rw-r--r--src/compiler/compiler.lm50
1 files changed, 8 insertions, 42 deletions
diff --git a/src/compiler/compiler.lm b/src/compiler/compiler.lm
index d5b16bb..c51b509 100644
--- a/src/compiler/compiler.lm
+++ b/src/compiler/compiler.lm
@@ -106,14 +106,10 @@ context fspec
ignore / '//' [^\n]* '\n' | space+ /
literal `: `[ `] `| `;
token VISUAL / 'nul' | 'dec' | 'hex' | 'str' /
- token ENDIANESS / 'le' | 'be' /
end
literal `enum `struct
- def endianess
- [name:ENDIANESS]
-
def visual
[name:VISUAL]
@@ -127,7 +123,7 @@ context fspec
def extra
# if set, this field has trivial length, otherwise need to read subscripts
length:collapser::collapsed
- [subscript:subscript* filter:filter* visual:visual? endianess:endianess?] {
+ [subscript:subscript* filter:filter* visual:visual?] {
f:str = ''
has_slice:bool
for l:subscript in repeat(r1) {
@@ -172,8 +168,8 @@ context fspec
# select ((expr)) { ... } name <extra>;
# struct (optional) { ... } name <extra>;
| [container:container::type name:reference::variable::type extra:extra `;]
- # (enum|struct) name { ... } <(le|be)>;
- | [container:container::type endianess:endianess? `;]
+ # (enum|struct) name { ... } <filters>;
+ | [container:container::type filter:filter* `;]
end
def source
@@ -196,17 +192,15 @@ if (!source) {
}
struct scope
- endianess:str
names:map<str, map<str, any>>
end
global g_scopes:list<scope> = new list<scope>()
void
-push_scope(endianess:str) {
+push_scope() {
s:scope = new scope()
s->names = new map<str, map<str, any>>()
- s->endianess = endianess
g_scopes->push_head(s)
}
@@ -271,28 +265,6 @@ container_name_str(s:str) { if (!s) return '<anon>' return s }
str
signed_str(s:bool) { if (s) return 'signed' return 'unsigned' }
-str
-endianess_str(s:str)
-{
- if (s == 'be')
- return 'big-endian'
- else if (s == 'le')
- return 'little-endian'
-
- print('something went wrong!\n')
- exit(1)
-}
-
-str
-endianess_from_decl(d:fspec::declaration::type)
-{
- endianess:str = g_scopes->top->endianess
- if (d.endianess)
- for e:fspec::declaration::endianess in child(d.endianess) endianess = $e
- if (d.extra && d.extra.endianess)
- for e:fspec::declaration::endianess in child(d.extra.endianess) endianess = $e
- return endianess
-}
void
print_declaration(d:fspec::declaration::type)
@@ -334,9 +306,7 @@ print_declaration(d:fspec::declaration::type)
print(' it needs to be filtered with `', $f.function, '`\n')
for v:fspec::declaration::visual in child(d.extra.visual)
- print(' and it should be visualized as `', $v.name, '`\n')
-
- print(' the field is in ', endianess_str(endianess_from_decl(d)), ' byte order\n')
+ print('and it should be visualized as `', $v.name, '`\n')
}
}
@@ -357,7 +327,7 @@ walk(d:fspec::declaration::type)
insert('variable', $i.decl.name, i)
}
} else if ($s.data.type == 'struct') {
- push_scope(endianess_from_decl(d))
+ push_scope()
for i:fspec::container::strukt::item in repeat(s.data.items) {
if (i.data.container)
walk(i.data)
@@ -366,25 +336,21 @@ walk(d:fspec::declaration::type)
}
pop_scope()
} else if ($s.data.type == 'select') {
- push_scope(endianess_from_decl(d))
- print('━━━━ start of (', $s.data.select, ') ━━━━\n')
+ push_scope()
for i:fspec::container::select::item in repeat(s.data.items) {
if (i.expr)
- print('━━━━ (', $i.expr, ')\n')
else
- print('━━━━ DEFAULT\n')
if (i.data.container)
walk(i.data)
else
print_declaration(i.data)
}
- print('━━━━ end of (', $s.data.select, ') ━━━━\n')
pop_scope()
}
}
-push_scope('le')
+push_scope()
for d:fspec::declaration::type in repeat(source.items)
walk(d)
pop_scope()