<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: interpreter code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 01:53:53 GMT</pubDate>
    <description>DZone Snippets: interpreter code</description>
    <item>
      <title>A solution for the "Interpreter" problem</title>
      <link>http://snippets.dzone.com/posts/show/5246</link>
      <description>A solution for the "Interpreter" problem.&lt;br /&gt; &lt;br /&gt;Problem description:&lt;br /&gt;&lt;a href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10033.html"&gt;http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10033.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Author: &lt;a href="http://www.inf.ufrgs.br/~jmftrindade"&gt;Joana Matos Fonseca da Trindade&lt;/a&gt;&lt;br /&gt;Date: 2008.03.16&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/* &lt;br /&gt; * Solution for the "Interpreter" problem.&lt;br /&gt; * UVa ID: 10033&lt;br /&gt; */&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;#define MAX_REG 10&lt;br /&gt;#define MAX_RAM 1000&lt;br /&gt;&lt;br /&gt;int pointer;&lt;br /&gt;int regArray[MAX_REG];&lt;br /&gt;int ram[MAX_RAM];&lt;br /&gt;&lt;br /&gt;/* initialize registers and ram */&lt;br /&gt;int init() {&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 0; i &lt; MAX_REG; i++) {&lt;br /&gt;		regArray[i] = 0;&lt;br /&gt;	}&lt;br /&gt;	for (i = 0; i &lt; MAX_RAM; i++) {&lt;br /&gt;		ram[i] = 0;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* decode instruction */&lt;br /&gt;int decode() {&lt;br /&gt;	int command, a1, a2;&lt;br /&gt;	command = ram[pointer] / 100;&lt;br /&gt;	a1 = (ram[pointer] % 100) / 10;&lt;br /&gt;	a2 = ram[pointer] % 10;&lt;br /&gt;	&lt;br /&gt;	switch (command) {&lt;br /&gt;		/* halt */&lt;br /&gt;		case 1 :		&lt;br /&gt;			return 0;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* set register a1 to a2 */&lt;br /&gt;		case 2 :&lt;br /&gt;			regArray[a1] = a2;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* add a2 to register a1 */&lt;br /&gt;		case 3 :&lt;br /&gt;			regArray[a1] = (regArray[a1] + a2) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* multiply register a1 by a2 */&lt;br /&gt;		case 4 :&lt;br /&gt;			regArray[a1] = (regArray[a1] * a2) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* set register a1 to the value of register a2 */&lt;br /&gt;		case 5 : &lt;br /&gt;			regArray[a1] = regArray[a2];&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* add the value of register a2 to register a1 */&lt;br /&gt;		case 6 : &lt;br /&gt;			regArray[a1] = (regArray[a1] + regArray[a2]) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* multiply register a1 by the value of register a2 */&lt;br /&gt;		case 7 :&lt;br /&gt;			regArray[a1] = (regArray[a1] * regArray[a2]) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* set register a1 to the value in RAM whose address is in register a2 */&lt;br /&gt;		case 8 :&lt;br /&gt;			regArray[a1] = ram[regArray[a2]];&lt;br /&gt;			pointer++;&lt;br /&gt;			break;			&lt;br /&gt;			&lt;br /&gt;		/* set the value in RAM whose address in in register a2 to that of register a1 */&lt;br /&gt;		case 9 :&lt;br /&gt;			ram[regArray[a2]] = regArray[a1];&lt;br /&gt;			pointer++;&lt;br /&gt;			break;			&lt;br /&gt;			&lt;br /&gt;		/* goto */		&lt;br /&gt;		case 0 :&lt;br /&gt;			if (regArray[a2] != 0) {&lt;br /&gt;				pointer = regArray[a1];&lt;br /&gt;			} else {&lt;br /&gt;				pointer++;&lt;br /&gt;			}&lt;br /&gt;			break;			&lt;br /&gt;			&lt;br /&gt;		default: &lt;br /&gt;			break;&lt;br /&gt;	}&lt;br /&gt;	return 1;	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* main */&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;	int i, j, cases, num_instr;&lt;br /&gt;	char instr[5];&lt;br /&gt;&lt;br /&gt;	scanf("%d", &amp;cases);&lt;br /&gt;	fgets(instr, sizeof(instr), stdin);&lt;br /&gt;	fgets(instr, sizeof(instr), stdin);&lt;br /&gt;	num_instr = 0;&lt;br /&gt;	&lt;br /&gt;	/* for the number of test cases specified */&lt;br /&gt;	for (i = 0; i &lt; cases; i++) {&lt;br /&gt;		init();&lt;br /&gt;		&lt;br /&gt;		pointer = 0;&lt;br /&gt;		&lt;br /&gt;		if (i != 0) {&lt;br /&gt;			printf("\n");&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		/* read input ram */&lt;br /&gt;		while(fgets(instr, sizeof(instr), stdin) != NULL) {&lt;br /&gt;			if (instr[0] == '\n') {&lt;br /&gt;				break;&lt;br /&gt;			}&lt;br /&gt;			ram[pointer] = (instr[0] - '0') * 100 + (instr[1] - '0') * 10 + (instr[2] - '0');&lt;br /&gt;			pointer++;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		/* decode and interpret instructions until halt */&lt;br /&gt;		num_instr = 1;&lt;br /&gt;		pointer = 0;&lt;br /&gt;		while (decode()) {&lt;br /&gt;			num_instr++;&lt;br /&gt;		}	&lt;br /&gt;		&lt;br /&gt;		printf("%d\n",num_instr);	&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 18 Mar 2008 09:26:35 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5246</guid>
      <author>jmftrindade (Joana M. F. da Trindade)</author>
    </item>
    <item>
      <title>Simple integer expression interpreter</title>
      <link>http://snippets.dzone.com/posts/show/4481</link>
      <description>This is a simple integer expression interpreter.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;iostream&gt;&lt;br /&gt;#include &lt;string&gt;&lt;br /&gt;#include &lt;map&gt;&lt;br /&gt;#include &lt;cctype&gt;&lt;br /&gt;&lt;br /&gt;char look;&lt;br /&gt;std::map&lt;std::string, int&gt; table;&lt;br /&gt;&lt;br /&gt;void getChar() {&lt;br /&gt;    look = std::cin.get();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void error(const std::string &amp;s) {&lt;br /&gt;    std::cout &lt;&lt; std::endl;&lt;br /&gt;    std::cout &lt;&lt; "Error: " &lt;&lt; s &lt;&lt; "." &lt;&lt; std::endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void abort(const std::string &amp;s) {&lt;br /&gt;    error(s);&lt;br /&gt;    exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void expected(const std::string &amp;s) {&lt;br /&gt;    abort(s + " Expected");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isAlpha(char c) {&lt;br /&gt;    return isalpha(c);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isDigit(char c) {&lt;br /&gt;    return isdigit(c);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isAlNum(char c) {&lt;br /&gt;    return isalnum(c);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isAddop(char c) {&lt;br /&gt;    return ((c == '+') || (c == '-'));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isMulop(char c) {&lt;br /&gt;    return (('*' == c) || ('/' == c));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isWhite(char c) {&lt;br /&gt;    return ((' ' == c) || ('\t' == c));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void skipWhite() {&lt;br /&gt;    while (isWhite(look))&lt;br /&gt;        getChar();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void match(char x) {&lt;br /&gt;    if (look != x)&lt;br /&gt;        expected(std::string("\"") + x + "\"");&lt;br /&gt;    else {&lt;br /&gt;        getChar();&lt;br /&gt;        skipWhite();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void emit(const std::string &amp;s) {&lt;br /&gt;    std::cout &lt;&lt; "\t"  &lt;&lt; s;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void emitLn(const std::string &amp;s) {&lt;br /&gt;    emit(s);&lt;br /&gt;    std::cout &lt;&lt; std::endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void newLine() {&lt;br /&gt;    if (look == '\n')&lt;br /&gt;        getChar();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;std::string getName() {&lt;br /&gt;    if (!isAlpha(look))&lt;br /&gt;        expected("Name");&lt;br /&gt;&lt;br /&gt;    std::string name;&lt;br /&gt;    while (isAlNum(look)) {&lt;br /&gt;        name += look;&lt;br /&gt;        getChar();&lt;br /&gt;    }&lt;br /&gt;    skipWhite();&lt;br /&gt;&lt;br /&gt;    return name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int getNum() {&lt;br /&gt;    int value(0);&lt;br /&gt;&lt;br /&gt;    if (!isDigit(look))&lt;br /&gt;        expected("Integer");&lt;br /&gt;&lt;br /&gt;    while (isDigit(look)) {&lt;br /&gt;        value = value * 10 + look - '0';&lt;br /&gt;        getChar();&lt;br /&gt;    }&lt;br /&gt;    skipWhite();&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int expression();&lt;br /&gt;&lt;br /&gt;int factor() {&lt;br /&gt;    int ret;&lt;br /&gt;&lt;br /&gt;    if (look == '(') {&lt;br /&gt;        match('(');&lt;br /&gt;        ret = expression();&lt;br /&gt;        match(')');&lt;br /&gt;    } else if (isAlpha(look)) {&lt;br /&gt;        std::string name = getName();&lt;br /&gt;        if (table.count(name) == 0)&lt;br /&gt;            table.insert(std::pair&lt;std::string, int&gt;(name, 0));&lt;br /&gt;        ret = table[name];&lt;br /&gt;    } else&lt;br /&gt;        ret = getNum();&lt;br /&gt;&lt;br /&gt;    return ret;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int term() {&lt;br /&gt;    int value = factor();&lt;br /&gt;&lt;br /&gt;    while (isMulop(look)) {&lt;br /&gt;        if (look == '*') {&lt;br /&gt;            match('*');&lt;br /&gt;            value *= factor();&lt;br /&gt;        } else if (look == '/') {&lt;br /&gt;            match('/');&lt;br /&gt;            value /= factor();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int expression() {&lt;br /&gt;    int value(0);&lt;br /&gt;&lt;br /&gt;    if (!isAddop(look))&lt;br /&gt;        value = term();&lt;br /&gt;&lt;br /&gt;    while (isAddop(look)) {&lt;br /&gt;        if (look == '+') {&lt;br /&gt;            match('+');&lt;br /&gt;            value += term();&lt;br /&gt;        } else if (look == '-') {&lt;br /&gt;            match('-');&lt;br /&gt;            value -= term();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void assignment() {&lt;br /&gt;    std::string name = getName();&lt;br /&gt;    match('=');&lt;br /&gt;    if (table.count(name) == 1)&lt;br /&gt;        table[name] = expression();&lt;br /&gt;    else&lt;br /&gt;        table.insert(std::pair&lt;std::string, int&gt;(name, expression()));&lt;br /&gt;&lt;br /&gt;    std::cout &lt;&lt; name &lt;&lt; " = " &lt;&lt; table[name] &lt;&lt; std::endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void init() {&lt;br /&gt;    getChar();&lt;br /&gt;    skipWhite();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;    init();&lt;br /&gt;&lt;br /&gt;    do {&lt;br /&gt;        assignment();&lt;br /&gt;        newLine();&lt;br /&gt;    } while ((look != '.') &amp;&amp; (look != '\n'));&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 30 Aug 2007 14:45:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4481</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Simple stack machine interpreter written in Scala</title>
      <link>http://snippets.dzone.com/posts/show/3629</link>
      <description>I wanted to implement a simple stack machine, and I wanted some practice with Scala. The two seemed to combine well.&lt;br /&gt;&lt;br /&gt;I'll write up a description of the instruction set when I can be bothered, but it's hopefully pretty self explanatory.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package StackMachine;&lt;br /&gt;&lt;br /&gt;import scala.collection.mutable._&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.File._;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.BufferedReader._ &lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.io.InputStreamReader._;&lt;br /&gt;import java.io.FileInputStream; &lt;br /&gt;import java.io.FileInputStream._;&lt;br /&gt;import scala.collection.jcl.ArrayList;&lt;br /&gt;&lt;br /&gt;class Memory(size : int) {&lt;br /&gt;    private val internalMemory = new Array[int](size);&lt;br /&gt;    &lt;br /&gt;    override def toString : String = internalMemory.toString;    &lt;br /&gt;&lt;br /&gt;    def load( location : int) = internalMemory(location % size);&lt;br /&gt;    def store( location : int, value : int) { &lt;br /&gt;        internalMemory(location % size) = value; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;abstract class Instruction;&lt;br /&gt;&lt;br /&gt;case class push (value : int) extends Instruction;&lt;br /&gt;case class pop extends Instruction;&lt;br /&gt;case class plus extends Instruction;&lt;br /&gt;case class print extends Instruction;&lt;br /&gt;case class break extends Instruction;&lt;br /&gt;case class dup extends Instruction;&lt;br /&gt;case class goto(instruction : int) extends Instruction;&lt;br /&gt;case class noop extends Instruction;&lt;br /&gt;case class ifCurrent(instruction : int) extends Instruction;&lt;br /&gt;case class minus extends Instruction;&lt;br /&gt;case class store(register : int) extends Instruction;&lt;br /&gt;case class load(register : int) extends Instruction;&lt;br /&gt;case class loadCurrent extends Instruction;&lt;br /&gt;case class storeCurrent extends Instruction;&lt;br /&gt;case class ifEmpty(instruction : int) extends Instruction;&lt;br /&gt;&lt;br /&gt;object Instruction{&lt;br /&gt;    def parse (value : String) = {&lt;br /&gt;        if (value.startsWith("#")) noop()&lt;br /&gt;        else {&lt;br /&gt;        val split = splitString(value);&lt;br /&gt;        val instruction = split._1.toLowerCase;&lt;br /&gt;        val args = split._2;&lt;br /&gt;&lt;br /&gt;        instruction match {&lt;br /&gt;            case "pop"          =&gt; pop()&lt;br /&gt;            case "plus"         =&gt; plus()&lt;br /&gt;            case "print"        =&gt; print()&lt;br /&gt;            case "push"         =&gt; push(args(0)) &lt;br /&gt;            case "break"        =&gt; break()&lt;br /&gt;            case "dup"          =&gt; dup()&lt;br /&gt;            case "goto"         =&gt; goto(args(0))&lt;br /&gt;            case "ifstack"      =&gt; ifCurrent(args(0))&lt;br /&gt;            case "store"        =&gt; store(args(0))&lt;br /&gt;            case "load"         =&gt; load(args(0))&lt;br /&gt;            case ""             =&gt; noop()&lt;br /&gt;            case "minus"        =&gt; minus()&lt;br /&gt;            case "ifempty"      =&gt; ifEmpty(args(0))&lt;br /&gt;            case "loadcurrent"  =&gt; loadCurrent()&lt;br /&gt;            case "storecurrent" =&gt; storeCurrent()&lt;br /&gt;            case  _             =&gt; throw new Exception("Couldn't parse " + value)}}}&lt;br /&gt;&lt;br /&gt;    private def splitString (value : String) = {&lt;br /&gt;        val strings = value.split("\\s");&lt;br /&gt;        &lt;br /&gt;        Tuple2[String, List[int]](strings(0), &lt;br /&gt;            for {&lt;br /&gt;                val i &lt;- List.range(1, strings.length);&lt;br /&gt;                strings(i) != ""}&lt;br /&gt;            yield Integer.parseInt(strings(i)))&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Machine(memorySize : int, states : Array[Instruction]) {&lt;br /&gt;    val stack = new Stack[int]();&lt;br /&gt;    val memory = new Memory(memorySize);&lt;br /&gt;    var position = 0;&lt;br /&gt;    &lt;br /&gt;    private def advance { position = position + 1; }&lt;br /&gt;    private def goto (instruction : int) { position = instruction - 1};    &lt;br /&gt;&lt;br /&gt;    private def execute (instruction : Instruction) = &lt;br /&gt;        instruction match {&lt;br /&gt;            // Stack manipulation&lt;br /&gt;            case push(value)            =&gt; { stack += value; &lt;br /&gt;                                             advance; }&lt;br /&gt;            case pop()                  =&gt; { stack.pop; &lt;br /&gt;                                             advance; }&lt;br /&gt;            case dup()                  =&gt; { stack += stack.top; &lt;br /&gt;                                             advance; }&lt;br /&gt;            &lt;br /&gt;            // Arithmetic&lt;br /&gt;            case plus()                 =&gt; { stack += (stack.pop + stack.pop); &lt;br /&gt;                                             advance; }&lt;br /&gt;            &lt;br /&gt;            case minus()                =&gt; { val second = stack.pop;&lt;br /&gt;                                             val first = stack.pop;&lt;br /&gt;                                             stack.push(if (second &gt; first) 0 else (first - second));&lt;br /&gt;                                             advance; }&lt;br /&gt;            // Control flow&lt;br /&gt;            // Our instructions are labelled from 1. Why? Laziness - vim does it that way.&lt;br /&gt;            case goto(instruction)      =&gt; goto(instruction);&lt;br /&gt;            case noop()                 =&gt; { advance; }&lt;br /&gt;            &lt;br /&gt;            case ifCurrent(instruction)   =&gt; { if (stack.pop == 0) goto(instruction); &lt;br /&gt;                                             else advance; }&lt;br /&gt;            case ifEmpty(instruction)   =&gt; { if (stack.isEmpty) goto(instruction);&lt;br /&gt;                                             else advance; }&lt;br /&gt;&lt;br /&gt;            // Memory manipulation&lt;br /&gt;            case load(register)         =&gt; { stack.push(memory.load(register));      &lt;br /&gt;                                             advance; }                                   &lt;br /&gt;            case store(register)        =&gt; { memory.store(register, stack.pop); &lt;br /&gt;                                             advance; }                                         &lt;br /&gt;            case loadCurrent()          =&gt; { stack.push(memory.load(stack.pop)); &lt;br /&gt;                                             advance;}&lt;br /&gt;            case storeCurrent()         =&gt; { val value = stack.pop;&lt;br /&gt;                                             val register = stack.pop;&lt;br /&gt;                                             memory.store(register, value);&lt;br /&gt;                                             advance;}&lt;br /&gt;            &lt;br /&gt;            // IO instructions&lt;br /&gt;            case print()                =&gt; { Console.println(stack.top); &lt;br /&gt;                                             advance; }&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;    def run(){&lt;br /&gt;        while (position &lt; states.length){&lt;br /&gt;            execute(states(position));&lt;br /&gt;        }&lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    def execute (instructions : Iterable[Instruction]) : Unit = { &lt;br /&gt;        for (val instruction &lt;- instructions)&lt;br /&gt;        yield execute(instruction : Instruction);&lt;br /&gt;        ();}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;object Main{&lt;br /&gt;    def main (args : Array[String]){&lt;br /&gt;        if (args.length &gt; 0){&lt;br /&gt;            val file = new File(args(0));&lt;br /&gt;            val reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));    &lt;br /&gt;&lt;br /&gt;            var line = reader.readLine();&lt;br /&gt;            &lt;br /&gt;            val instructions = new ArrayList[Instruction]();&lt;br /&gt;&lt;br /&gt;            while (line != null) {&lt;br /&gt;                val instruction = Instruction.parse(line);&lt;br /&gt;                instructions.add(instruction); &lt;br /&gt;                 &lt;br /&gt;                &lt;br /&gt;                line = reader.readLine();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            val machine = new Machine(32, instructions.toArray);&lt;br /&gt;            &lt;br /&gt;            for (val i &lt;- List.range(1, args.length))&lt;br /&gt;            yield { machine.stack.push(Integer.parseInt(args(i))); }&lt;br /&gt;            &lt;br /&gt;            machine.run();&lt;br /&gt;            &lt;br /&gt;            Console.print("\n\n");&lt;br /&gt;            Console.println("Machine terminated with:");&lt;br /&gt;            Console.println("     Memory: " + machine.memory);&lt;br /&gt;            Console.println("     Stack: " + machine.stack);&lt;br /&gt;            Console.print("\n\n");&lt;br /&gt;        }&lt;br /&gt;        else Console.println("Please supply a file name");                &lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 04 Mar 2007 23:00:32 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3629</guid>
      <author>DRMacIver (David R. MacIver)</author>
    </item>
    <item>
      <title>bf.py</title>
      <link>http://snippets.dzone.com/posts/show/3536</link>
      <description>// Brainfuck Interpreter&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;"""A Brainfuck interpreter"""&lt;br /&gt;&lt;br /&gt;__author__="Andrew Pennebaker (andrew.pennebaker@gmail.com)"&lt;br /&gt;__date__="18 Nov 2005 - 27 Feb 2006"&lt;br /&gt;__copyright__="Copyright 2006 Andrew Pennebaker"&lt;br /&gt;__license__="GPL"&lt;br /&gt;__version__="0.5"&lt;br /&gt;__URL__="http://snippets.dzone.com/posts/show/3536"&lt;br /&gt;&lt;br /&gt;from aio import chomp&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;from getopt import getopt&lt;br /&gt;&lt;br /&gt;tape=[0]*100&lt;br /&gt;address=0&lt;br /&gt;&lt;br /&gt;def sublevel(toplevel):&lt;br /&gt;	i=0&lt;br /&gt;&lt;br /&gt;	# until a balanced-bracket code block is found, add a character&lt;br /&gt;&lt;br /&gt;	while toplevel[0:i+1].count("[")!=toplevel[0:i+1].count("]"): i+=1&lt;br /&gt;&lt;br /&gt;	return toplevel[1:i]&lt;br /&gt;&lt;br /&gt;def run(instructions):&lt;br /&gt;	global tape&lt;br /&gt;	global address&lt;br /&gt;&lt;br /&gt;	position=0&lt;br /&gt;	while position&lt;len(instructions):&lt;br /&gt;		cmd=instructions[position]&lt;br /&gt;&lt;br /&gt;		if cmd=="&lt;": address-=1&lt;br /&gt;		elif cmd=="&gt;": address+=1&lt;br /&gt;		elif cmd=="+": tape[address]+=1&lt;br /&gt;		elif cmd=="-": tape[address]-=1&lt;br /&gt;		elif cmd==".": sys.stdout.write(chr(tape[address]))&lt;br /&gt;		elif cmd==",":&lt;br /&gt;			try: tape[address]=ord(sys.stdin.read(1))&lt;br /&gt;			except: tape[address]=-1&lt;br /&gt;		elif cmd=="[":&lt;br /&gt;			level=sublevel(instructions[position:])&lt;br /&gt;			while tape[address]!=0: run(level)&lt;br /&gt;&lt;br /&gt;			position+=len(level)+1&lt;br /&gt;&lt;br /&gt;		position+=1&lt;br /&gt;&lt;br /&gt;def usage():&lt;br /&gt;	print "Usage: %s [options] &lt;sourcefile&gt;" % (sys.argv[0])&lt;br /&gt;	print "--help (usage)"&lt;br /&gt;&lt;br /&gt;	sys.exit()&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;	systemArgs=sys.argv[1:] # ignore program name&lt;br /&gt;&lt;br /&gt;	live=False&lt;br /&gt;&lt;br /&gt;	optlist=[]&lt;br /&gt;	args=[]&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		optlist, args=getopt(systemArgs, None, ["help"])&lt;br /&gt;	except Exception, e:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	live=len(args)&lt;1&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="--help":&lt;br /&gt;			usage()&lt;br /&gt;&lt;br /&gt;	if live:&lt;br /&gt;		print "--BF Interpreter 0.5--"&lt;br /&gt;		print "  Type exit to exit."&lt;br /&gt;&lt;br /&gt;		line="not exit"&lt;br /&gt;		while line!="exit":&lt;br /&gt;			sys.stdout.write("% ")&lt;br /&gt;			line=chomp(sys.stdin.readline())&lt;br /&gt;&lt;br /&gt;			if line.count("[")!=line.count("]"):&lt;br /&gt;				raise "Unbalanced brackets"&lt;br /&gt;			else:&lt;br /&gt;				run(line)&lt;br /&gt;	else:&lt;br /&gt;		src=args[0]&lt;br /&gt;&lt;br /&gt;		srcfile=open(src, "r")&lt;br /&gt;		code="".join(srcfile.readlines())&lt;br /&gt;		srcfile.close()&lt;br /&gt;&lt;br /&gt;		if code.count("[")!=code.count("]"):&lt;br /&gt;			raise "Unbalanced brackets"&lt;br /&gt;		else:&lt;br /&gt;			run(code)&lt;br /&gt;&lt;br /&gt;if __name__=="__main__":&lt;br /&gt;	try:&lt;br /&gt;		main()&lt;br /&gt;	except KeyboardInterrupt, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 19 Feb 2007 00:52:20 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3536</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>Math Parser //JavaScript Class</title>
      <link>http://snippets.dzone.com/posts/show/2207</link>
      <description>&lt;a href="http://www.jsfromhell.com/classes/math-processor"&gt;&lt;br /&gt;This class is able to parse math expressions and also run user defined functions.&lt;br /&gt;&lt;br /&gt;On JavaScript there's the "eval" function, that can do such things well, but this code objective was just to give me fun or a new challenge =)~&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;x = new MathProcessor;&lt;br /&gt;try{alert(x.parse("1+2-(3*4) + medium(2,3) - frac( 2.2231)"));}&lt;br /&gt;catch(e){alert(e);}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It's possible to add more functions to the class, just add them into the "methods" property ;]&lt;br /&gt;&lt;br /&gt;Well, that's it :)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/classes/math-processor [v1.0]&lt;br /&gt;&lt;br /&gt;MathProcessor = function(){ //v1.0&lt;br /&gt;    var o = this;&lt;br /&gt;    o.o = {&lt;br /&gt;        "+": function(a, b){ return +a + b; },&lt;br /&gt;        "-": function(a, b){ return a - b; },&lt;br /&gt;        "%": function(a, b){ return a % b; },&lt;br /&gt;        "/": function(a, b){ return a / b; },&lt;br /&gt;        "*": function(a, b){ return a * b; },&lt;br /&gt;        "^": function(a, b){ return Math.pow(a, b); },&lt;br /&gt;        "~": function(a, b){ return Math.sqrt(a, b); }&lt;br /&gt;    };&lt;br /&gt;    o.s = { "^": 3, "~": 3, "*": 2, "/": 2, "%": 1, "+": 0, "-": 0 };&lt;br /&gt;    o.u = {"+": 1, "-": -1}, o.p = {"(": 1, ")": -1};&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;MathProcessor.prototype.parse = function(e){&lt;br /&gt;    for(var n, x, o = [], s = [x = this.RPN(e.replace(/ /g, "").split(""))]; s.length;)&lt;br /&gt;        for((n = s[s.length-1], --s.length); n[2]; o[o.length] = n, s[s.length] = n[3], n = n[2]);&lt;br /&gt;    for(; (n = o.pop()) != undefined; n[0] = this.o[n[0]](isNaN(n[2][0]) ? this.f(n[2][0]) : n[2][0], isNaN(n[3][0]) ? this.f(n[3][0]) : n[3][0]));&lt;br /&gt;    return +x[0];&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;MathProcessor.prototype.methods = {&lt;br /&gt;    "div": function(a, b){ return parseInt(a / b); },&lt;br /&gt;    "frac": function(a){ return a - parseInt(a); },&lt;br /&gt;    "sum": function(n1, n2, n3, n){ for(var r = 0, a, l = (a = arguments).length; l; r += a[--l]); return r; },&lt;br /&gt;    "medium": function(a, b){ return (a + b) / 2; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;MathProcessor.prototype.error = function(s){&lt;br /&gt;    throw new Error("MathProcessor: " + (s || "Erro na express&#227;o"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;MathProcessor.prototype.RPN = function(e){&lt;br /&gt;    var _, r, c = r = [, , , 0];&lt;br /&gt;    if(e[0] in this.u || !e.unshift("+"))&lt;br /&gt;        for(; e[1] in this.u; e[0] = this.u[e.shift()] * this.u[e[0]] + 1 ? "+" : "-");&lt;br /&gt;    (c[3] = [this.u[e.shift()], c, , 0])[1][0] = "*", (r = [, , c, 0])[2][1] = r;&lt;br /&gt;    (c[2] = this.v(e))[1] = c;&lt;br /&gt;    (!e.length &amp;&amp; (r = c)) || (e[0] in this.s &amp;&amp; ((c = r)[0] = e.shift(), !e.length &amp;&amp; this.error()));&lt;br /&gt;     while(e.length){&lt;br /&gt;        if(e[0] in this.u){&lt;br /&gt;            for(; e[1] in this.u; e[0] = this.u[e.shift()] * this.u[e[0]] + 1 ? "+" : "-");&lt;br /&gt;            (c = c[3] = ["*", c, , 0])[2] = [-1, c, , 0];&lt;br /&gt;        }&lt;br /&gt;        (c[3] = this.v(e))[1] = c;&lt;br /&gt;        e[0] in this.s &amp;&amp; (c = this.s[e[0]] &gt; this.s[c[0]] ?&lt;br /&gt;            ((c[3] = (_ = c[3], c[2]))[1][2] = [e.shift(), c, _, 0])[2][1] = c[2]&lt;br /&gt;            : r == c ? (r = [e.shift(), , c, 0])[2][1] = r&lt;br /&gt;            : ((r[2] = (_ = r[2], [e.shift(), r, ,0]))[2] = _)[1] = r[2]);&lt;br /&gt;    }&lt;br /&gt;    return r;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;MathProcessor.prototype.v = function(e){&lt;br /&gt;    if("0123456789.".indexOf(e[0]) + 1){&lt;br /&gt;        for(var i = -1, l = e.length; ++i &lt; l &amp;&amp; "0123456789.".indexOf(e[i]) + 1;);&lt;br /&gt;        return [+e.splice(0,i).join(""), , , 0];&lt;br /&gt;    }&lt;br /&gt;    else if(e[0] == "("){&lt;br /&gt;        for(var i = 0, l = e.length, j = 1; ++i &lt; l &amp;&amp; (e[i] in this.p &amp;&amp; (j += this.p[e[i]]), j););&lt;br /&gt;        return this.RPN(l = e.splice(0,i), l.shift(), !j &amp;&amp; e.shift());&lt;br /&gt;    }&lt;br /&gt;    else{&lt;br /&gt;        var i = 0, c = e[0].toLowerCase();&lt;br /&gt;        if((c &gt;= "a" &amp;&amp; c &lt;= "z") || c == "_"){&lt;br /&gt;            while(((c = e[++i].toLowerCase()) &gt;= "a" &amp;&amp; c &lt;= "z") || c == "_" || (c &gt;= 0 &amp;&amp; c &lt;= 9));&lt;br /&gt;            if(c == "("){&lt;br /&gt;                for(var l = e.length, j = 1; ++i &lt; l &amp;&amp; (e[i] in this.p &amp;&amp; (j += this.p[e[i]]), j););&lt;br /&gt;                return [e.splice(0,i+1).join(""), , , 0];&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    this.error();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;MathProcessor.prototype.f = function(e){&lt;br /&gt;    var i = 0, n;&lt;br /&gt;    if(((e = e.split(""))[i] &gt;= "a" &amp;&amp; e[i] &lt;= "z") || e[i] == "_"){&lt;br /&gt;        while((e[++i] &gt;= "a" &amp;&amp; e[i] &lt;= "z") || e[i] == "_" || (e[i] &gt;= 0 &amp;&amp; e[i] &lt;= 9));&lt;br /&gt;        if(e[i] == "("){&lt;br /&gt;            !this.methods[n = e.splice(0, i).join("")] &amp;&amp; this.error("Fun&#231;&#227;o \"" + n + "\" n&#227;o encontrada"), e.shift();&lt;br /&gt;            for(var a = [], i = -1, j = 1; e[++i] &amp;&amp; (e[i] in this.p &amp;&amp; (j += this.p[e[i]]), j);)&lt;br /&gt;                j == 1 &amp;&amp; e[i] == "," &amp;&amp; (a.push(this.parse(e.splice(0, i).join(""))), e.shift(), i = -1);&lt;br /&gt;            a.push(this.parse(e.splice(0,i).join(""))), !j &amp;&amp; e.shift();&lt;br /&gt;        }&lt;br /&gt;        return this.methods[n].apply(this, a);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 15 Jun 2006 20:34:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2207</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
