diff options
Diffstat (limited to 'repl.d')
-rw-r--r-- | repl.d | 77 |
1 files changed, 34 insertions, 43 deletions
@@ -1,69 +1,60 @@ import std.stdio; import std.string; -import std.conv; import std.variant; import std.typecons; -import std.container : SList; - import src.stack; static import definition = src.definition; static import primitives = src.primitives.eval; -template process(T) -if ( is(T == int) || is(T == bool) ) { - void process(T value) { - try { - if ( !primitives.evaluate(value) ) { - stack.push(value); - } - } - catch (Exception ex) { - writeln("Error: ", ex.msg); - } - } -} - -void process(string word) { +Stack!Token resolve(Token token) { try { - if ( !primitives.evaluate(word) ) { - if ( word in definition.words ) { - foreach ( token; definition.words[word] ) { - process(token); - } - } else { - stack.push(word); - } + if ( primitives.evaluate(token) ) { + return primitives.result; + } else { + return token.visit!( + (int value) => Stack!Token(Token(value)), + (bool value) => Stack!Token(Token(value)), + (string word ) => definition.get(word) + ); } } catch (Exception ex) { writeln("Error: ", ex.msg); + return Stack!Token(); } } -void process(Token token) { - token.visit!( - (int value) => process(value), - (bool value) => process(value), - (string word ) => process(word) - ); +void process(string value) { + Stack!Token buffer; + Token token = toToken(value); + + if ( !definition.handle(token) ) { + buffer = resolve(token); + } + + while ( !buffer.empty ) { + Token current = buffer.pop; + + if ( !definition.handle(current) ) { + Stack!Token resolved = resolve(current); + + if ( !resolved.empty ) { + if ( resolved.front == current ) { + stack.push(current); + } else { + buffer.insertFront(resolved[]); + } + } + } + } } void main() { while ( !stdin.eof ) { foreach ( token; stdin.readln.split ) { - if ( token.isNumeric ) { - auto value = parse!int(token); - - if ( !definition.handle(value) ) { - process(value); - } - } else { - if ( !definition.handle(token) ) { - process(token); - } - } + process(token); } } } |