[Megoldva] Qt4 RegExp kifejezési probléma

 ( pelz | 2008. december 28., vasárnap - 12:39 )

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?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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.

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.\
:)");

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.

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)

Minden esetre, nagyon köszönöm a hozzászólásodat!

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ó.

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

^(\/\/)"[^"]+"

vagy valami nagyon hasonlo az idezojelre.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

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

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.

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!