added comments "//" and "##"
This commit is contained in:
parent
00f79af101
commit
75b7207ed9
93
init.lua
93
init.lua
|
@ -1,43 +1,108 @@
|
||||||
local parser = {}
|
local parser = {}
|
||||||
|
|
||||||
local elements = "(%s*%g+)"
|
local elements = {
|
||||||
|
names = "(%a%w+)",
|
||||||
|
spaces = "(%s+)",
|
||||||
|
special = "[%%%(%)%{%}%;%,]",
|
||||||
|
strings = "[\"']",
|
||||||
|
special_combined = "([%+%-%*/%^#=~<>%[%]%:.][%+%-/#=%[%]:%.]?[%.]?)",
|
||||||
|
}
|
||||||
|
|
||||||
|
--FIXME: allow multiple paterns
|
||||||
|
local function optmatch(str,pat)
|
||||||
|
local cutstr = str
|
||||||
|
return function()
|
||||||
|
if not cutstr then return end
|
||||||
|
local spos,epos = cutstr:find(pat)
|
||||||
|
local match
|
||||||
|
local found = (spos == 1)
|
||||||
|
if found then
|
||||||
|
match = cutstr:sub(spos,epos)
|
||||||
|
cutstr = cutstr:sub(epos+1)
|
||||||
|
--print("f",match,cutstr,pat)
|
||||||
|
elseif not spos then
|
||||||
|
match = cutstr
|
||||||
|
cutstr = nil
|
||||||
|
--print("n",match,pat)
|
||||||
|
else
|
||||||
|
match = cutstr:sub(1,spos-1)
|
||||||
|
cutstr = cutstr:sub(spos)
|
||||||
|
--print("p",match,cutstr,pat)
|
||||||
|
end
|
||||||
|
return match, found
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function parser.test_optmatch()
|
||||||
|
assert(optmatch("123","123")() == "123")
|
||||||
|
assert(optmatch("123","321")() == "123")
|
||||||
|
assert(optmatch("123","1")() == "1")
|
||||||
|
assert(optmatch("123","2")() == "1")
|
||||||
|
end
|
||||||
|
|
||||||
local function parse_element(el,pc)
|
local function parse_element(el,pc)
|
||||||
local space = el:match("%s*")
|
|
||||||
local word = el:sub(#space+1)
|
|
||||||
if pc.foreach == 2 then
|
if pc.foreach == 2 then
|
||||||
pc.foreach = 3
|
pc.foreach = 3
|
||||||
return space.."pairs("..word
|
return "pairs("..el
|
||||||
end
|
end
|
||||||
if word == "foreach" then
|
if el == "foreach" then
|
||||||
pc.foreach = 1
|
pc.foreach = 1
|
||||||
return space .. "for"
|
return "for"
|
||||||
elseif word == "for" then
|
elseif el == "for" then
|
||||||
pc.foreach = 0
|
pc.foreach = 0
|
||||||
elseif word == "in" then
|
elseif el == "in" then
|
||||||
if pc.foreach == 1 then
|
if pc.foreach == 1 then
|
||||||
pc.foreach = 2
|
pc.foreach = 2
|
||||||
end
|
end
|
||||||
elseif word == "do" then
|
elseif el == "do" then
|
||||||
if pc.foreach == 3 then
|
if pc.foreach == 3 then
|
||||||
return ")" .. el
|
return ")" .. el
|
||||||
end
|
end
|
||||||
|
elseif el == '"' or el == "'" then
|
||||||
|
if not pc.instring then
|
||||||
|
pc.instring = el
|
||||||
|
elseif pc.instring == el then
|
||||||
|
pc.instring = false
|
||||||
end
|
end
|
||||||
--print(el)
|
elseif el == "[[" then
|
||||||
|
if not pc.instring then
|
||||||
|
pc.instring = el
|
||||||
|
end
|
||||||
|
elseif el == "]]" then
|
||||||
|
if pc.instring == "[[" then
|
||||||
|
pc.instring = false
|
||||||
|
end
|
||||||
|
elseif el == "//" or el=="##" then
|
||||||
|
if not pc.instring then
|
||||||
|
return "--"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--print(el,pc.instring and "in string" or "")
|
||||||
return el
|
return el
|
||||||
end
|
end
|
||||||
|
|
||||||
local function parse_line(l,pc)
|
local function parse_line(l,pc)
|
||||||
local pl = ""
|
local pl = ""
|
||||||
for w in l:gmatch(elements) do
|
local i = 0
|
||||||
pl = pl .. parse_element(w,pc)
|
for sp,s in optmatch(l,elements.spaces) do
|
||||||
|
if s then
|
||||||
|
pl = pl .. sp
|
||||||
|
else
|
||||||
|
for sc in optmatch(sp,elements.special_combined) do
|
||||||
|
for ss in optmatch(sc,elements.special) do
|
||||||
|
for st in optmatch(ss,elements.strings) do
|
||||||
|
pl = pl .. parse_element(st,pc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return pl
|
return pl
|
||||||
end
|
end
|
||||||
|
|
||||||
function parser.loadvenus(file)
|
function parser.loadvenus(file)
|
||||||
local fc = ""
|
local fc = ""
|
||||||
local pc = {opencurly = {}}
|
local pc = {instring == false, opencurly = {}}
|
||||||
for l in io.lines(file) do
|
for l in io.lines(file) do
|
||||||
fc = fc .. parse_line(l,pc) .. "\n"
|
fc = fc .. parse_line(l,pc) .. "\n"
|
||||||
end
|
end
|
||||||
|
@ -52,4 +117,6 @@ function parser.dovenus(file)
|
||||||
return ff()
|
return ff()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
parser.optmatch = optmatch
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
local p = dofile("src/init.lua")
|
local p = dofile("init.lua")
|
||||||
|
|
||||||
p.dovenus("src/test.venus")
|
p.dovenus("test.venus")
|
||||||
|
|
13
test.venus
13
test.venus
|
@ -18,9 +18,15 @@ foreach i,el in testt do
|
||||||
print(i.." = "..el)
|
print(i.." = "..el)
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[ coming soon
|
// comment
|
||||||
|
## comment
|
||||||
//comment
|
//comment
|
||||||
|
assert("//"=="/".."/")
|
||||||
|
-- comment
|
||||||
|
assert([[
|
||||||
|
##]]=="#".."#","comment within [[string]] falsely detected")
|
||||||
|
|
||||||
|
--[[ coming soon
|
||||||
fn a()
|
fn a()
|
||||||
print("function")
|
print("function")
|
||||||
end
|
end
|
||||||
|
@ -33,6 +39,11 @@ j = j + 2
|
||||||
i++
|
i++
|
||||||
j += 2
|
j += 2
|
||||||
|
|
||||||
|
function dec(n)
|
||||||
|
n--
|
||||||
|
return n -- not a decrement
|
||||||
|
end
|
||||||
|
|
||||||
function t() {
|
function t() {
|
||||||
print("hi")
|
print("hi")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue