emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: cc-mode help - how to support literal strings in C# syntax?


From: Andreas Roehler
Subject: Re: cc-mode help - how to support literal strings in C# syntax?
Date: Fri, 01 Jan 2010 12:43:09 +0100
User-agent: Thunderbird 2.0.0.19 (X11/20081227)

ok, had to change beg-end.el still a little bit, as beg- and end-string are 
equal here

Here its use in thingatpt-utils-base.el

;; Doublequoted

(put 'doublequoted 'beginning-op-at
     (lambda ()
         (beginning-of-form-base "\"" "\"" nil 1)))

(put 'doublequoted 'end-op-at
     (lambda ()
       (when (looking-at "\"")
           (end-of-form-base "\"" "\"" nil 1))))

It now returns things between regardless escapes. Not uploaded yet.

Still some minor issues, checks to do. I'll send a message, if its ready.

hopefully, happy new year

Andreas

dino chiesa wrote:
> Andreas, thanks for the reply. 
> The mode is available at: 
> http://www.emacswiki.org/emacs/csharp-mode.el
>  
>  
> And here is a source code module that exhibits the problem:
> //========================================
> using System;
> using System.Collections.Generic;
> 
> namespace Example.LiteralStrings
> {
>     public class Pippo
>     {
>         // Problem: when the final char in an "escaped" string literal is a
>         // slash, indenting and fontification breaks.
>         List<string> directories = new List<string> {
>             // string #1 in the list
>             @"C:\Temp\sub1\",
>                     // The emacs parser thinks the string has not ended.
>                     // This comment is fontified and indented as if it is in
>                     // the middle of a string literal.
>             // string #2
>                     @"C:\Temp\sub2\",
>             // Because we have another \" at the end of a string,
>             // emacs now thinks we're "out" of the string literal.
>             // This comment is now indented and fontified correctly.
>             // string #3
>             @"C:\Home\"
>                     // A third \", and now emacs thinks we're back inside the 
> string literal.
>                     // The rest of the code will be treated as if it were 
> inside the string literal.
>                 };  // this is indented wrongly
> // and the incorrect indenting continues all the way through
>             protected void Page_Load(object sender, EventArgs e)
>             {
>                 Console.WriteLine("Hello {0}", "world");
>             }
>         }
>     }
> 
> //========================================
>  
>  
> I will check out the beg-end.el as well, to see if I can figure out how to 
> use it in cc-mode. 
> (csharp-mode).
>  
> I'll be interested to see what you find. 
>  
>  
> -Dino
>  
> 
> 
>> Date: Tue, 29 Dec 2009 11:43:58 +0100
>> From: address@hidden
>> To: address@hidden
>> CC: address@hidden; address@hidden
>> Subject: Re: cc-mode help - how to support literal strings in C# syntax?
>>
>> dino chiesa wrote:
>>> I'm improving the csharp-mode from 
>>> http://www.emacswiki.org/emacs/CSharpMode . In case you're not aware, it's 
>>> derived from cc-mode, something like Java, but with a few different 
>>> syntactic quirks. 
>>>
>>> The existing csharp-mode.el is pretty good. 
>>> There were a couple things I fixed: 
>>>
>>> - #if/else/endif was not being properly recognized, 
>>> was indenting and fontifying strangely
>>>
>>> - a struct was not being treated as a class - indenting inside the block 
>>> was broken.
>>>
>>> - class definitions that derived from other classes were not being parsed 
>>> as a class. 
>>>
>>> These are all minor things I was able to resolve by using c-lang-defconst 
>>> on various constants: c-typeless-decl-kwds, c-other-block-decl-kwds, 
>>> c-cpp-message-directives, c-cpp-expr-directives, c-colon-type-list-kwds, 
>>> c-symbol-chars, c-block-prefix-disallowed-chars, and a few others.
>>>
>>> There's one think I haven't been able to resolve. In C# syntax, strings can 
>>> be specified as they are in C - surrounded by quotes. There's also a 
>>> special form of literal string that begins with @, n which all characters 
>>> in the string are to be treated as "escaped". In other words 
>>>
>>> @"\usr\bin" == "\\usr\\bin"
>>>
>>> The problem happens when the literal string ends in a slash. Eg 
>>> @"\usr\bin\" The cc-mode syntax engine sees that as an unterminated string, 
>>> the \" is an escaped double-quote. On the other hand the C# compiler sees 
>>> it as a string of 9 chars. 
>>>
>>> Because it isn't parsed correctly, the fontification and indenting is wrong 
>>> after a @-prefixed string that ends in a slash. 
>>>
>>>
>>> How can I get the prefixed strings to be treated correctly? 
>>>
>> Made a beg-end.el for this kind of parsings.
>> Would try it with your problem.
>> Feel free to send me your mode as far its done.
>> Maybe some larger test-code too.
>>
>> Should you want to try it yourself, get beg-end.el at
>>
>> https://code.launchpad.net/s-x-emacs-werkstatt/
>>
>>
>> Andreas
>>
>>
>>
>>
>>> Defining a special c-in-literal seems not to be it. That function uses 
>>> parse-partial-sexp , which apparently determines if the point is within a 
>>> string or not. 
>>>
>>> Modifying the syntax table to insert @ as a special prefix is also not it. 
>>>
>>> Any suggestions? 
>>>
>>> address@hidden
>>>
>>> _________________________________________________________________
>>> Hotmail: Trusted email with powerful SPAM protection.
>>> http://clk.atdmt.com/GBL/go/177141665/direct/01/
>>>
>>>
>>                                        
> _________________________________________________________________
> Hotmail: Trusted email with powerful SPAM protection.
> http://clk.atdmt.com/GBL/go/177141665/direct/01/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]