|
I'm creating a code editor with syntax highlighting and need help with the regular expressions. I've read a couple pages about it but can't figure out the exact way to do what I want.
For now, I only need support for comments and keywords like 'if', 'else', and so on. For the comments I created the following pattern:
string commentPattern = @"%.*";
It means that it matches everything to the right of, and including, the '%' character. This should be colored green. This works fine. The next pattern is for the keywords and looks like this:
string syntaxPattern = @"(\bif\b)|(\bwhile\b)|(\bclassdef\b)|(\bproperties\b)|(\bend\b)|(\bmethods\b)|(\bfunction\b)|(\belse\b)|(\bfor\b)";
It means it matches any of these words. These keywords are colored blue. It works fine too. BUT, when I run these two patterns parallell the keywords are colored blue even if they are in a comment. How can I create a pattern that doesn't color the keywords blue if there is a '%' character to the left of them???
Thanks for help!
|
|
|
|
|
Probably it can be done in regular expressions themselves, but if I were you, I'd consider making your highligher a bit more intelligent. Parse your code chunk by chunk, word by word, then once you find a comment, you will just move to next line, when you find a keyword, you will move to next word etc. It can come handy for more complicated cases.
Other way is of course parsing the text, which would be probably to complicated for your needs.
|
|
|
|
|
Thanks for your reply. Can you perhaps give a little more detail on this approach?
|
|
|
|
|
Lets say you have:
<br />
int x; % foo<br />
% bar<br />
x = 5; %x = 5<br />
Your rules:
keyword = 'int'
ident = Everything that starts with _ or letter and has letters,digits,_ after that
comment = Starts with % to newline.
Now you write simple lexer that will scan letter by letter, trying to fit what you have to as many possibilities as you can. When no possibilites are left, you go back one letter, and find first one that fits. So, for our example would be:
buffer: what it can be:
'i' int or ident
'in' int or ident
'int' int or ident
'int ' nothing. Go back 1 letter
'int' first rule that fits is keyword int, so it's int
' ' fits nothing from beggining, so ignore it
'x' fits ident
'x ' fits nothing, go back
...
So generally, you will get lists of tokens, their start and end position, so you just color them .
|
|
|
|
|
Thanks for your help. I'll take a look at it!
|
|
|
|
|
Hi,
How can i sleep a thread for ever and how to continue the thread which is sleeping for ever?
I need to use in pause and play.
Thankyou
YPKI
|
|
|
|
|
Infinite wait is not the best option in most cases, timeout can be handy.
And for your problem, you could use ManualResetEvent.
Msdn[^]
|
|
|
|
|
I agree, ManualResetEvent is IMHO the best solution. In your case you might not need a timeout, however, because a long pause does not indicate an exceptional case (if you are making a "play/pause" sort of functionality).
But remember to implement IDisposable in your class, and signal the ManualResetEvent before Disposing to make sure that your background thread ends also, otherwise you will end up waiting forever.
|
|
|
|
|
I am having following code in delphi language.
i want to convert it into C#
The delphi contains CreateOleObject method. but in .net we are not having such method. how to convert it.
code:
//set com port
Comet := CreateOleObject('Comteck.xy');
Comet.ComPort := "COM1";
I wamt to Use that 'Comteck.xy' file compulsary. please help me.
Thanks in advance
gaurav
|
|
|
|
|
Right click your project in VS and select "Add reference". Then select your COM object from the list of installed objects. .Net will create a managed wrapper class (RCW) which you can use to instantiate the object and access it like it was a managed object.
|
|
|
|
|
How to create a generic FTP Uploader windows Service which could upload Multiple Files at Different Folders to Differeent FTP Locations?
|
|
|
|
|
There are multiple "hows" possible. Simplest would be to write a batchfile that uses the FTP command, and execute that
I are troll
|
|
|
|
|
Hi,
I have a media center that is activated by a remote control.
My computer uses dual monitors, and I would like to make it so that the secondary monitor turns off when I start up the media software.
Ive found working examples that turn off both monitors, does anyone know of a good example that will turn just one off?
Cheers,
Mark Brock
"We're definitely not going to make a G or a PG version of this. It's not PillowfightCraft." -- Chris Metzen
Click here to view my blog
|
|
|
|
|
|
I'm developing a countdown timee that will support Pause function and I'm wondering that how can I get the passed milliseconds from Timer. I'm not sure that it is possible but perhaps it might possible through API.
I do not want timer calls tick event after each millisecond, what I want is once I set Interval(eg. 5000) then if I call Pause just after 3000 passed then when resume it should start with 3000. It would be easily possible if I can get the Timer passed millisecond...
any idea guys or any other way ?
edited
this helped me
Environment.TickCount
thanks all of you guys
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKQUFK[M`UKs*$GwU#QDXBER@CBN%
R0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
-----------------------------------------------
128 bit encrypted signature, crack if you can
modified on Thursday, April 9, 2009 8:54 AM
|
|
|
|
|
You could use DateTime.Now and subtract one from another to give you a timespan. Timers I don't believe allow you to access their internals.
DateTime has a resolution of about 15ms I believe.
Regards,
Rob Philpott.
|
|
|
|
|
DateTime itself has a resolution of 1 tick, which is 100ns.
What you probably wanted to say was that Windows.Forms.Timer is not very precise, because it always invokes the handler from a Gui thread, which means it will sometimes have to wait until OS is done doing Gui stuff before it actually calls the handler delegate.
|
|
|
|
|
Quite. But DateTime.Now will give not give you 100ns resolution. More like 15ms.
Regards,
Rob Philpott.
|
|
|
|
|
Good point, resolution of the Now property is in ms, and depends on the system. In Vista it seems to have a 1ms resolution, I just tested it:
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder(16384);
for (int i = 0; i < 10000; i++)
sb.AppendLine(String.Format("{0:HH:mm:ss.ffff}", DateTime.Now));
Console.WriteLine(sb.ToString());
Console.ReadLine();
}
System.Diagnostics.Stopwatch on the other hand is much more precise:
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder(16384);
Stopwatch sw = new Stopwatch(); sw.Start();
DateTime now = DateTime.Now;
for (int i = 0; i < 10000; i++)
sb.AppendLine(String.Format("{0:HH:mm:ss.fffff}", now + sw.Elapsed));
Console.WriteLine(sb.ToString());
Console.ReadLine();
}
|
|
|
|
|
Hey nice, stopwatch is new to me. We have some performance timers in the system I work on, but they use raw API calls via interop to do their stuff. Just tried your first example - the elapse is usually 15ms but sometimes 16ms, so on XP I guess the resolution is 15.something ms.
Regards,
Rob Philpott.
|
|
|
|
|
It all depends on the available hardware; you may want to look at the article "Timer surprises, and how to avoid them"[^] which predates .NET 2.0 and hence does not mention StopWatch (which is based on PerformanceCounters anyway).
|
|
|
|
|
You can create a new background thread with a manual reset event, waiting for a specified amount of seconds or an external Set.
int msToWait = 5000;
do {
manualStartEvent.WaitOne();
Stopwatch sw = new Stopwatch();
sw.Start();
bool externalSet = manualPauseEvent.WaitOne(msToWait);
sw.Stop();
int actualMsElapsed = sw.Elapsed.TotalMilliseconds;
if (externalSet)
{
msToWait -= actualMsElapsed;
if (msToWait < 0)
msToWait = 0;
}
else
{
msToWait = 0;
}
} while (msToWait > 0);
[EDIT] Code is posted only as an idea, you should take care of starting the thread, handling Stop situations and proper disposing all events.
modified on Thursday, April 9, 2009 8:39 AM
|
|
|
|
|
hmmm nice way...thanks
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKQUFK[M`UKs*$GwU#QDXBER@CBN%
R0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
-----------------------------------------------
128 bit encrypted signature, crack if you can
|
|
|
|
|
Hi All,
I am unable to deserialize the byte array to the object of structure on another machine,when i send it through TCP/IP by socket then there is no problem in serialization.,but problem occurs at the other side during deserialization.
It shows the error something like "unable to find assembly....."
I am using the following code....
private byte[] ObjectToByteArray(Object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, obj);
return ms.ToArray();
}
// Convert a byte array to an Object
private Object ByteArrayToObject(byte[] arrBytes)
{
MemoryStream memStream = new MemoryStream(arrBytes);
BinaryFormatter binForm = new BinaryFormatter();
memStream.Position = 0;
//memStream.Write(arrBytes, 0, arrBytes.Length);
// memStream.Seek(0, SeekOrigin.Begin);
Object obj = (Object)binForm.Deserialize(memStream);
return obj;
}
Please help,it is urgent....
Regards
Lalit Narayan
|
|
|
|
|
That's telling you that it needs to know about the type (defined in an assembly you don't have loaded) in order to deserialise it. Make sure its in your project's references on the deserialisation side.
Regards,
Rob Philpott.
|
|
|
|