w Lua 5.1, można iteracyjne z bohaterów ciąg tego w kilku sposobów
podstawowa pętla będzie:.
for i = 1, #str do
local c = str:sub(i,i)
-- do something with c
end
Ale może to być bardziej efektywne w użyciu wzoru z string.gmatch()
dostać iterator ciągu znaków:
for c in str:gmatch"." do
-- do something with c
end
Albo nawet do korzystania string.gsub()
wywołać funkcję dla każdego char:
str:gsub(".", function(c)
-- do something with c
end)
We wszystkich z powyższego, skorzystałem z faktu, że moduł string
jest ustawiany jako metatabilny dla wszystkich wartości łańcuchowych, więc jego funkcje mogą być wywoływane jako elementy przy użyciu notacji :
. Użyłem również (nowy w 5.1, IIRC) #
, aby uzyskać długość łańcucha.
Najlepsza odpowiedź dla aplikacji zależy od wielu czynników, a testy porównawcze to znajomość, jeśli wydajność ma znaczenie.
Możesz chcieć oceniać dlaczego trzeba iteracyjne ciągu znaków, a spojrzeć na jednym z regularnych modułów ekspresyjnych, które zostały zobowiązane do Lua, lub do nowoczesnego podejścia spojrzeć lpeg modułu Roberto, który implementuje parsowania Wyrażenie Grammers dla Lua.
Dzięki. O module lpeg, o którym wspomniałeś - czy zapisuje pozycje tokenów w oryginalnym tekście po tokenizacji? Zadanie, które muszę wykonać, polega na podświetleniu składni specyficznego prostego języka w scite za pośrednictwem lua (bez skompilowanego parsera C++). Również, jak zainstalować LPG? Wydaje się, że ma .c źródło w dystrybucji - czy musi być skompilowane razem z lua? – grigoryvp
Building lpeg utworzy bibliotekę DLL (lub .so), która powinna być przechowywana tam, gdzie jest to wymagane. (np. gdzieś zidentyfikowane przez zawartość globalnego pakietu.cpath w instalacji lua). Musisz także zainstalować jego moduł pomocniczy re.lua, jeśli chcesz użyć jego uproszczonej składni. Z gramatyki lpeg można uzyskać wywołania zwrotne i przechwytywać tekst na wiele sposobów, a na pewno można użyć przechwytywania, aby po prostu zapisać lokalizację dopasowania do późniejszego wykorzystania. Jeśli celem jest podświetlanie składni, to PEG nie jest złym wyborem narzędzia. – RBerteig
Nie wspominając już o [najnowszych wydaniach SciTE] (http: //www.scintilla.org/SciTEDownload.html) (od 2.22) to Scintillua, lexer na bazie LPEG, co oznacza, że może działać od razu po wyjęciu z pudełka, bez konieczności ponownego kompilowania. –