Ich habe einen Tokenizer für meine Sprache in Python geschrieben, aber wenn ich versuche, eine Datei zu tokenisieren, wird sie nur bis zu einem Grenzwert in Token umgewandelt. Es Tokenizer nur zu rund 90 Tokens (Wörter und Symbole getrennt), wenn es die gesamte Datei in Tokens zu machen. Hier ist der Code:Python Tokenizer: Word-Limit
import re
file = input("filename>")
with open(file, 'r') as myfile:
data=myfile.read().replace('\n', '')
scanner = re.Scanner([
(r"[0-9]+", lambda scanner,token:("NUMBER", token)),
(r"[a-z_A-Z_λ]+", lambda scanner,token:("KEYWORD", token)),
(r"[,.!#%^*()']+", lambda scanner,token:("OPERATOR", token)),
(r'["]+', lambda scanner,token:("OPERATOR", token)),
(r"[+-]+", lambda scanner,token:("OPERATOR", token)),
(r'[=]+', lambda scanner,token:("OPERATOR", token)),
(r"[{}]+", lambda scanner,token:("OPERATOR", token)),
(r'[[]]+', lambda scanner,token:("OPERATOR", token)),
(r"\s+", None), # None == skip token.
])
results, remainder = scanner.scan(data)
print(results)
Das Beispielskript ist (für diejenigen, die Zeit haben, lesen):
constant Flow = "Flow"
constant script = this
local names = {'Gabriel', 'Kauan', 'Laura', 'Tarsila'}
constant flowCountry = 'Brasil'
local void function getinpairs(name) extends findArg()
for _, v(name) in pairs(names) do
private local table = names
print("Flow being the best programming language for you, has implemented some new arguments!")
local flowFounder = names[1]
local namesMetatable = getmetatable(t1)
end
end
function findArg(name)
return getinpairs(name)
end
findArg('Gabriel')
Und das Ergebnis ist (für diejenigen, die Zeit haben, lesen):
[('KEYWORD', 'constant'), ('KEYWORD', 'Flow'), ('OPERATOR', '='), ('OPERATOR', '"'), ('KEYWORD', 'Flow'), ('OPERATOR', '"'), ('KEYWORD', 'constant'), ('KEYWORD', 'script'), ('OPERATOR', '='), ('KEYWORD', 'thislocal'), ('KEYWORD', 'names'), ('OPERATOR', '='), ('OPERATOR', '{'), ('OPERATOR', "'"), ('KEYWORD', 'Gabriel'), ('OPERATOR', "',"), ('OPERATOR', "'"), ('KEYWORD', 'Kauan'), ('OPERATOR', "',"), ('OPERATOR', "'"), ('KEYWORD', 'Laura'), ('OPERATOR', "',"), ('OPERATOR', "'"), ('KEYWORD', 'Tarsila'), ('OPERATOR', "'"), ('OPERATOR', '}'), ('KEYWORD', 'constant'), ('KEYWORD', 'flowCountry'), ('OPERATOR', '='), ('OPERATOR', "'"), ('KEYWORD', 'Brasil'), ('OPERATOR', "'"), ('KEYWORD', 'local'), ('KEYWORD', 'void'), ('KEYWORD', 'function'), ('KEYWORD', 'getinpairs'), ('OPERATOR', '('), ('KEYWORD', 'name'), ('OPERATOR', ')'), ('KEYWORD', 'extends'), ('KEYWORD', 'findArg'), ('OPERATOR', '()'), ('KEYWORD', 'for'), ('KEYWORD', '_'), ('OPERATOR', ','), ('KEYWORD', 'v'), ('OPERATOR', '('), ('KEYWORD', 'name'), ('OPERATOR', ')'), ('KEYWORD', 'in'), ('KEYWORD', 'pairs'), ('OPERATOR', '('), ('KEYWORD', 'names'), ('OPERATOR', ')'), ('KEYWORD', 'do'), ('KEYWORD', 'private'), ('KEYWORD', 'local'), ('KEYWORD', 'table'), ('OPERATOR', '='), ('KEYWORD', 'names'), ('KEYWORD', 'print'), ('OPERATOR', '('), ('OPERATOR', '"'), ('KEYWORD', 'Flow'), ('KEYWORD', 'being'), ('KEYWORD', 'the'), ('KEYWORD', 'best'), ('KEYWORD', 'programming'), ('KEYWORD', 'language'), ('KEYWORD', 'for'), ('KEYWORD', 'you'), ('OPERATOR', ','), ('KEYWORD', 'has'), ('KEYWORD', 'implemented'), ('KEYWORD', 'some'), ('KEYWORD', 'new'), ('KEYWORD', 'arguments'), ('OPERATOR', '!'), ('OPERATOR', '"'), ('OPERATOR', ')'), ('KEYWORD', 'local'), ('KEYWORD', 'flowFounder'), ('OPERATOR', '='), ('KEYWORD', 'names')]
Es stoppt bei Zeile 11: Wort "Name".
Jemand könnte den Fehler auf das Skript zeigen?
BTW sein sollte: Haben Sie [PLY - Python Lex-Yacc] s (http://www.dabeaz.com/ ply/index.html), mit dem Sie eine eigene Sprache erstellen können? – furas
Nun, ich weiß, dass es existiert, aber als ein ambicious Kerl mit 0 Erfahrung in Python, ich weiß nicht, wie man es benutzt, also machte ich diesen einfachen Lexer für meine Programmiersprache mit meinem Glück, Tutorials zu finden. Diese Programmiersprache wird übrigens Flow heißen und ist von Lua inspiriert. – iiHarvx