Language now supports top level definitions. no more last-expression-is-a-value thing, it's also a def. Host knows to run the special `os` def

master
Dustin Swan 8 hours ago
parent 9b8916eb72
commit 31ef279f16
Signed by: dustinswan
GPG Key ID: 30D46587E2100467

@ -2,6 +2,7 @@ import type { Value } from './types';
// Literals and Variables
export type Literal = {
kind: 'literal'
value: Value

@ -25,14 +25,20 @@ const cgCode = stdlibCode + '\n' +
try {
const tokens = tokenize(cgCode);
const parser = new Parser(tokens, cgCode);
const ast = parser.parse();
const definitions = parser.parse();
// console.log(ast);
const env: Env = new Map(Object.entries(builtins));
const appRecord = evaluate(ast, env, cgCode);
// console.log("appRecord", appRecord);
if (appRecord.kind !== 'record')
for (const def of definitions) {
const value = evaluate(def.body, env, cgCode);
env.set(def.name, value);
}
const appRecord = env.get('os');
console.log("appRecord", appRecord);
if (!appRecord || appRecord.kind !== 'record')
throw new Error('Expected record');
const init = appRecord.fields.init;

@ -1,5 +1,5 @@
import type { Token } from './lexer'
import type { AST, MatchCase, Pattern } from './ast'
import type { AST, MatchCase, Pattern, Definition } from './ast'
import { ParseError } from './error'
export class Parser {
@ -114,8 +114,29 @@ export class Parser {
}
}
parse(): AST {
return this.parseExpression();
parse(): Definition[] {
const definitions: Definition[] = [];
while (this.current().kind !== 'eof') {
definitions.push(this.parseDefinition());
}
return definitions;
}
private parseDefinition(): Definition {
const nameToken = this.expect('ident');
const name = (nameToken as { value: string }).value;
this.expect('equals');
const body = this.parseExpression();
if (this.current().kind !== 'eof') {
this.expect('semicolon');
}
return { kind: 'definition', name, body, ...this.getPos(nameToken) };
}
private parseExpression(): AST {

@ -37,4 +37,4 @@ view = state viewport \
}
};
{ init = init, update = update, view = view }
os = { init = init, update = update, view = view }

Loading…
Cancel
Save