Skip to content

Commit abe0195

Browse files
Create lexer for lox (#1100)
Close #1073 The Lox language is from the book "Crafting Interpreters" https://craftinginterpreters.com/
1 parent dfb2819 commit abe0195

File tree

3 files changed

+853
-0
lines changed

3 files changed

+853
-0
lines changed

lexers/embedded/lox.xml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<lexer>
2+
<config>
3+
<name>lox</name>
4+
<filename>*.lox</filename>
5+
<dot_all>true</dot_all>
6+
<ensure_nl>true</ensure_nl>
7+
</config>
8+
<rules>
9+
<state name="classname">
10+
<rule pattern="[a-zA-Z_]\w*">
11+
<token type="NameClass"/>
12+
<pop depth="1"/>
13+
</rule>
14+
</state>
15+
<state name="funname">
16+
<rule pattern="[a-zA-Z_]\w*">
17+
<token type="NameFunction"/>
18+
<pop depth="1"/>
19+
</rule>
20+
</state>
21+
<state name="varname">
22+
<rule pattern="[a-zA-Z_]\w*">
23+
<token type="NameVariable"/>
24+
<pop depth="1"/>
25+
</rule>
26+
</state>
27+
<state name="whitespace">
28+
<rule pattern="\n">
29+
<token type="Text"/>
30+
</rule>
31+
<rule pattern="\s+">
32+
<token type="Text"/>
33+
</rule>
34+
</state>
35+
<state name="root">
36+
<rule>
37+
<include state="whitespace"/>
38+
</rule>
39+
<rule pattern="//.*?\n">
40+
<token type="CommentSingle"/>
41+
</rule>
42+
<rule pattern="(and|else|for|if|or|print|return|super|this|while)\b">
43+
<token type="Keyword"/>
44+
</rule>
45+
<rule pattern="(false|nil|true)\b">
46+
<token type="KeywordConstant"/>
47+
</rule>
48+
<rule pattern="(class)(\s*)">
49+
<token type="KeywordDeclaration"/>
50+
<push state="classname"/>
51+
</rule>
52+
<rule pattern="(fun)(\s*)">
53+
<token type="KeywordDeclaration"/>
54+
<push state="funname"/>
55+
</rule>
56+
<rule pattern="(var)(\s*)">
57+
<token type="KeywordDeclaration"/>
58+
<push state="varname"/>
59+
</rule>
60+
<rule pattern="\d+(\.\d*|[eE][+\-]?\d+)">
61+
<token type="LiteralNumberFloat"/>
62+
</rule>
63+
<rule pattern="[0-9][0-9]*">
64+
<token type="LiteralNumberInteger"/>
65+
</rule>
66+
<rule pattern="&#34;(\\\\|\\&#34;|[^&#34;])*&#34;">
67+
<token type="LiteralStringDouble"/>
68+
</rule>
69+
<rule pattern="!|\+|-|\*|/|&lt;|&gt;|=">
70+
<token type="Operator"/>
71+
</rule>
72+
<rule pattern="[{(;,]">
73+
<token type="Punctuation"/>
74+
</rule>
75+
<rule pattern="[}).]">
76+
<token type="Punctuation"/>
77+
</rule>
78+
<rule pattern="[a-zA-Z_]\w*">
79+
<token type="NameVariable"/>
80+
</rule>
81+
</state>
82+
</rules>
83+
</lexer>

lexers/testdata/lox.actual

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Your first Lox program!
2+
print "Hello, world!";
3+
4+
true; // Not false.
5+
false; // Not *not* false.
6+
7+
1234; // An integer.
8+
12.34; // A decimal number.
9+
10+
"I am a string";
11+
""; // The empty string.
12+
"123"; // This is a string, not a number.
13+
14+
nil;
15+
16+
add + me;
17+
subtract - me;
18+
multiply * me;
19+
divide / me;
20+
21+
-negateMe;
22+
23+
less < than;
24+
lessThan <= orEqual;
25+
greater > than;
26+
greaterThan >= orEqual;
27+
28+
1 == 2; // false.
29+
"cat" != "dog"; // true.
30+
31+
314 == "pi"; // false.
32+
33+
123 == "123"; // false.
34+
35+
!true; // false.
36+
!false; // true.
37+
38+
true and false; // false.
39+
true and true; // true.
40+
41+
false or false; // false.
42+
true or false; // true.
43+
44+
{
45+
print "One statement.";
46+
print "Two statements.";
47+
}
48+
49+
var imAVariable = "here is my value";
50+
var iAmNil;
51+
52+
var breakfast = "bagels";
53+
print breakfast; // "bagels".
54+
breakfast = "beignets";
55+
print breakfast; // "beignets".
56+
57+
if (condition) {
58+
print "yes";
59+
} else {
60+
print "no";
61+
}
62+
63+
var a = 1;
64+
while (a < 10) {
65+
print a;
66+
a = a + 1;
67+
}
68+
69+
for (var a = 1; a < 10; a = a + 1) {
70+
print a;
71+
}
72+
73+
makeBreakfast(bacon, eggs, toast);
74+
75+
makeBreakfast();
76+
77+
fun addPair(a, b) {
78+
return a + b;
79+
}
80+
fun identity(a) {
81+
return a;
82+
}
83+
print identity(addPair)(1, 2); // Prints "3".
84+
85+
fun returnFunction() {
86+
var outside = "outside";
87+
fun inner() {
88+
print outside;
89+
}
90+
return inner;
91+
}
92+
var fn = returnFunction();
93+
fn();
94+
95+
class Breakfast {
96+
cook() {
97+
print "Eggs a-fryin'!";
98+
}
99+
serve(who) {
100+
print "Enjoy your breakfast, " + who + ".";
101+
}
102+
}
103+
104+
// Store it in variables.
105+
var someVariable = Breakfast;
106+
107+
// Pass it to functions.
108+
someFunction(Breakfast);
109+
110+
breakfast.meat = "sausage";
111+
breakfast.bread = "sourdough";
112+
113+
class Breakfast {
114+
init(meat, bread) {
115+
this.meat = meat;
116+
this.bread = bread;
117+
}
118+
// ...
119+
}
120+
var baconAndToast = Breakfast("bacon", "toast");
121+
baconAndToast.serve("Dear Reader");
122+
// "Enjoy your bacon and toast, Dear Reader."
123+
124+
class Brunch < Breakfast {
125+
init(meat, bread, drink) {
126+
super.init(meat, bread);
127+
this.drink = drink;
128+
}
129+
drink() {
130+
print "How about a Bloody Mary?";
131+
}
132+
}

0 commit comments

Comments
 (0)