Sziasztok!
A Qt4-ben található kis syntaxhighlighter példa programmal küzdök. Az a gondom, hogy a megjegyzéseket és az idézőjelben lévő dolgokat néha összekeveri.
A program ezen része így néz ki:
singleLineCommentFormat.setForeground(Qt::red);
rule.pattern = QRegExp("//[^\n]*");
rule.format = singleLineCommentFormat;
highlightingRules.append(rule);
multiLineCommentFormat.setForeground(Qt::red);
quotationFormat.setForeground(Qt::darkGreen);
rule.pattern = QRegExp("\".*\"");
rule.format = quotationFormat;
highlightingRules.append(rule);
Az első RegExp kifejezés arról szól, hogy mit tekintsen egy sorban lévő // megjegyzésnek, a második pedig azt, hogy mit tekintsen idézőjelek közti kifejezésnek.
Nagyjából jól is működik, de ha a programot saját magára eresztem rá, azaz ezt a C++ fájt nyitom meg, amiben ez a rész van, akkor az első RegExp kifejezés nem jelenik meg helyesen.
Ez zöld lesz: "//[^\n]*"
Ez pedig piros: );
Tehát az idéző jelek közti rész helyesen zöld lesz, de a ); résznek nem kellene pirosnak lennie, hiszen nincs a sorban megjegyzés. Habár az idézőjelek közt valóban ott szerepel a kettős perjel //.
A lényeg, hogy egy olyan RegExp kifejezésre lenne szükségem a megjegyzés érzékelésnél, ami észreveszi, hogy a kettős perjel idézőjelek közt szerepel, ezért nem kell vele foglalkozni.
Van valakinek ötlete, mit lehetne megadni?
- 1193 megtekintés
Hozzászólások
Még nem jöttem rá, de letöltöttem a QDevelop program forráskódját, hátha az jobban megoldja ezt a problémát.
- A hozzászóláshoz be kell jelentkezni
Nem jók a rule-jaid. Ha fordítva adod hozzá a őket, akkor máshogy csinálja majd. Eleve a komment csak ott kezdődhet, ahol nincs idézőjelek között. De vigyázz, mert lehet ilyen kód is:
foo("A kovetkezo sorban folytatodik ez a sor\
//de van benne kommentjel is.\
:)");
- A hozzászóláshoz be kell jelentkezni
Szia!
Megcseréltem a két szabály sorrendjét, de így még rosszabb lett.
Most már az egész // jelek utáni részt is és a jeleket is megjegyzésnek veszi a program.
Tehát:
" rész zölden jelenik meg.
//[^\n]*"); rész pirosan jelenik meg.
- A hozzászóláshoz be kell jelentkezni
Igen, pont ezt kell csinálnia, egymás után alkalmazza a rule-okat, és szinez, van amit kétszer is, de csak az utolsó eredménye látszik.
(Ettől függetlenül tudom, hogy te nem ezt akartad:), de már látom találtál megoldást)
- A hozzászóláshoz be kell jelentkezni
Minden esetre, nagyon köszönöm a hozzászólásodat!
- A hozzászóláshoz be kell jelentkezni
De viszont a QDevelop-ban használt CppHighlighter teljesen megoldotta a problémát.
Azzal már rendesen működik. Jóval bonyolultabb, de legalább jó.
- A hozzászóláshoz be kell jelentkezni
Igazából nincs itt semmi probléma...
Talál egy //-t: komment: piros.
Talál egy " "-t: string: zöld.
Ha be lehet állítani azt hogy amit már beszinezett azt nen nézze újra, akkor állítsd be, cseréld meg a sorrendet, és működni fog.
Egyébként olyan regexp kéne a kommenthez ami kizárja, hogy idézőjelek között legyen, illetve olyan az idézőjelhez, ami kizárja, hogy komment...
Bevallom szerintem a regexp erre alkalmatlan....
Gondolom a CppHighlighter nem regexp-et használ.
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
^(\/\/)"[^"]+"
vagy valami nagyon hasonlo az idezojelre.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
A '//asd "asd"'-re ez működik? Ha jól látom nem.
'^(\/\/).*"[^"]+"' szerü dolog meg szerintem beszinezi az "-jel előtti szöveget is...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Soronként nem lehet, ld.:
1: "\
2: \\szoveg vagy komment?"
Ha az első sor elejére beraksz egy \\-t, akkor a második sor is komment, különben mindkét sor szöveg.
Viszont az egész szöveget nézve egy olyan véges automatával, aminek az állapotaihoz színeket rendelünk, megoldható a probléma, ebből következik, hogy egy olyan regexppel is megoldható, aminek a részkifejezéseihez rendelünk színeket. Ez viszont már sokkal bonyolultabb, sajnos.
- A hozzászóláshoz be kell jelentkezni
Mint mondottam, a QDevelop-ban használt highlighter megoldás nagyon korrekt módon megoldotta a problémámat. Sőt azt felhasználva sikerült más nyelvre (Pascal) is adaptálnom a highlightert.
Ez már figyelembe veszi, hogy mi van egy sorba, mi nem. És minden egyéb dolgot is jól lekezel.
Csak ajánlani tudom!
- A hozzászóláshoz be kell jelentkezni