Ich habe an a text editor gearbeitet, das LPEG verwendet, um Unterstützung für Syntaxhervorhebung zu implementieren. Die Einrichtung war ziemlich einfach, aber ich habe nur das Minimum getan.Verwenden von Lpeg, um nur Wortgrenzen zu erfassen
Ich habe eine Reihe von Mustern wie folgt definiert:
-- Keywords
local keyword = C(
P"auto" +
P"break" +
P"case" +
P"char" +
P"int"
-- more ..
)/function() add_syntax(RED, ...)
Dieser Eingang richtig behandelt, aber leider zu viel übereinstimmt. Zum Beispiel int
passt in der Mitte von printf
, die erwartet wird, weil ich "P
" für eine wörtliche Übereinstimmung verwende.
Offensichtlich „richtige“ ausführen muss ich passen auf Wortgrenzen markieren, so dass „int“ Spiele „int“, aber nicht „printf“, „vsprintf“ usw.
Ich habe versucht, zu verwenden, dies das Spiel nur auftritt, nachdem „<[{ \n
“ zu begrenzen, aber dies nicht tun, was ich will:
-- space, newline, comma, brackets followed by the keyword
S(" \n(<{,")^1 * P"auto" +
gibt es eine einfache, klar, Lösung, die ich hier bin fehlt nur Schlüsselwörter/Token übereinstimmen, die sind umgeben von Leerzeichen oder anderen Zeichen, die Sie in C-Code erwarten würden? Ich brauche das erbeutete Token, damit ich es hervorheben kann, aber ansonsten bin ich mit keinem bestimmten Ansatz verheiratet.
z.B. Diese sollten übereinstimmen:
int foo;
void(int argc,std::list<int,int>) { .. };
aber dies sollte nicht:
fprintf(stderr, "blah. patterns are hard\n");
Ich war anspruchsvoll, wollte eine Antwort auf einem Teller, aber Sie haben meine Erwartungen definitiv übertroffen. Akzeptiert. Ich danke dir sehr. –
Kopfgeld Magie angewendet. –