2017-11-26 3 views
1

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?

+0

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

+1

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

Antwort

0

Sie müssen die Klammern entkommen:

r'[[]]+' 

r'[\[\]]+'