- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.lua
More file actions
Latest commit
128 lines (108 loc) · 3.34 KB
/
Copy pathparser.lua
File metadata and controls
128 lines (108 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
localStack=require('lib.Stack')
localfunctiontable_has(table, value)
for_, valinipairs(table) do
ifval==valuethen
returntrue
end
end
returnfalse
end
localfunctionnewCommand(command, parent)
localobj= { value=command, next=nil }
ifparentthen
parent.next=obj
end
returnobj
end
localfunctionparse(rawScript)
localcommands= {}
localcurrent=1
localcommand=nil
localnextToken=string.gmatch(rawScriptor'', "[%a_]+")
localifStack=Stack:new()
localloopStack=Stack:new()
whiletruedo
localtoken=nextToken()
ifnottokenthen
break
end
iftable_has({ 'forward', 'backward', 'left', 'right', 'open' },
token) then
command=newCommand(token, command)
commands[current] =command
current=current+1
elseiftable_has({'ifexit', 'ifstart'}, token) then
command=newCommand(token, command)
commands[current] =command
current=current+1
command.exit=newCommand('endif', command)
commands[current] =command.exit
current=current+1
command.elseBranch=newCommand('else', nil)
commands[current] =command.elseBranch
command.elseBranch.next=command.exit
current=current+1
command.thenBranch=newCommand('then', nil)
commands[current] =command.thenBranch
command.thenBranch.next=command.exit
current=current+1
ifStack:push(command)
command=command.thenBranch
elseiftoken=='else' then
localifcond=ifStack:top()
ifnotifcondthen
returnnil
end
command.next=ifcond.exit
command=ifcond.elseBranch
elseiftoken=='endif' then
localifcond=ifStack:top()
ifnotifcondthen
returnnil
end
ifStack:pop()
ifcommandthen
command.next=ifcond.exit
end
command=ifcond.exit
elseiftoken=='loop' then
command=newCommand(token, command)
commands[current] =command
current=current+1
loopStack:push(command)
command.exit=newCommand('endloop', nil)
commands[current] =command.exit
current=current+1
elseiftoken=='endloop' then
localloop=loopStack:top()
ifnotloopthen
returnnil
end
ifcommandthen
command.next=loop
end
command=loop.exit
loopStack:pop()
elseiftoken=='break' then
localloop=loopStack:top()
ifnotloopthen
returnnil
end
command=newCommand(token, command)
commands[current] =command
current=current+1
command.next=loop.exit
command=nil
else-- unknown token
returnnil
end
end
ififStack:top() then
returnnil
end
commands.top=commands[1]
returncommands
end
return {
parse=parse,
}