Finished migrating parser to be object orientation free. All tests pass
This commit is contained in:
61
app/imports/parser/parseTree/symbol.js
Normal file
61
app/imports/parser/parseTree/symbol.js
Normal file
@@ -0,0 +1,61 @@
|
||||
import resolve from '../resolve.js';
|
||||
import constant from './constant.js';
|
||||
|
||||
const symbol = {
|
||||
create({name}){
|
||||
return {
|
||||
parseType: 'symbol',
|
||||
name,
|
||||
};
|
||||
},
|
||||
toString(node){
|
||||
return `${node.name}`
|
||||
},
|
||||
compile(node, scope, context, calledFromReduce = false){
|
||||
let value = scope && scope[node.name];
|
||||
let type = typeof value;
|
||||
// For objects, default to their .value
|
||||
if (type === 'object'){
|
||||
value = value.value;
|
||||
type = typeof value;
|
||||
}
|
||||
// For parse nodes, compile and return
|
||||
if (value?.parseType){
|
||||
if (calledFromReduce){
|
||||
return resolve('reduce', value, scope, context);
|
||||
} else {
|
||||
return resolve('compile', value, scope, context);
|
||||
}
|
||||
}
|
||||
if (type === 'string' || type === 'number' || type === 'boolean'){
|
||||
return {
|
||||
result: constant.create({value}),
|
||||
context,
|
||||
};
|
||||
} else if (type === 'undefined'){
|
||||
return {
|
||||
result: symbol.create({name: node.name}),
|
||||
context,
|
||||
};
|
||||
} else {
|
||||
throw new Meteor.Error(`Unexpected case: ${node.name} resolved to ${value}`);
|
||||
}
|
||||
},
|
||||
reduce(node, scope, context){
|
||||
let {result} = symbol.compile(node, scope, context, true);
|
||||
if (result.parseType === 'symbol'){
|
||||
context.error({
|
||||
type: 'info',
|
||||
message: `${result.toString()} not found, set to 0`
|
||||
});
|
||||
return {
|
||||
result: constant.create({value: 0}),
|
||||
context,
|
||||
};
|
||||
} else {
|
||||
return {result, context};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default symbol;
|
||||
Reference in New Issue
Block a user