Roderland / glox

A Lox interpreter implemented with golang

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

glox

A Lox interpreter implemented with golang

From the book: http://www.craftinginterpreters.com/

Try it Online on Playground

Usage

build your glox

go build glox

run some lox code

./glox ${InputFile}

here are some test cases

./glox test_case/01.glox
./glox test_case/02.glox
./glox test_case/03.glox

About lox language

print "Hello, world!";

// Boolean
print true;             // Not false.
print false;            // Not not false.

// Number
print 1234;             // An integer.
print 12.34;            // A decimal number.

// String
print "I am a string";
print "";               // The empty string.
print "123";            // This is a string, not a number.

// Nil
print nil;

// Comparison and equality
print 1 == 2;           // false.
print "cat" != "dog";   // true.

print 314 == "pi";      // false.
print 123 == "123";     // false.

print !true;            // false.
print !false;           // true.

// Logical operators
print true and false;   // false.
print true and true;    // true.
print false or false;   // false.
print true or false;    // true.

// Precedence and grouping
print (1 + 2) / 2;      // 1.5

// Variables
var breakfast = "bagels";
print breakfast;        // "bagels".
breakfast = "beignets";
print breakfast;        // "beignets".

// Control Flow
var condition = true;
if (condition) {
  print "yes";          // "yes"
} else {
  print "no";
}

var a = 1;
while (a < 10) {
  print a;
  a = a + 1;
}

for (var a = 1; a < 10; a = a + 1) {
  print a;
}

// Functions
fun sum(a, b) {
  return a + b;
}

print sum(1, 2);

As plugin

// 编译成动态链接库作为插件
go build -o glox.so -buildmode=plugin *.go
go run ${宿主程序}.go glox.so

参考下面这个例程可以加载插件到你的程序中。

其中,play函数作为调用glox解释器的入口,buf保存每次调用glox解释器执行的输出结果。

//
// load the application "glox"  from a plugin file "glox.so"
//
func loadPlugin(filename string) (func(string), *bytes.Buffer) {
	p, err := plugin.Open(filename)
	if err != nil {
		log.Fatalf("cannot load plugin %v", filename)
	}
	xplay, err := p.Lookup("Play")
	if err != nil {
		log.Fatalf("cannot find Play in %v", filename)
	}
	play := xplay.(func(string))
	xbuf, err := p.Lookup("Buf")
	if err != nil {
		log.Fatalf("cannot find Buf in %v", filename)
	}
	buf := xbuf.(*bytes.Buffer)

	return play, buf
}

About

A Lox interpreter implemented with golang


Languages

Language:Go 100.0%