End Of Line character and others not working.

Alan alanpotteiger at gmail.com
Fri Aug 16 22:39:45 PDT 2013


On Saturday, 17 August 2013 at 05:37:18 UTC, H. S. Teoh wrote:
> On Sat, Aug 17, 2013 at 07:19:19AM +0200, Alan wrote:
>> On Saturday, 17 August 2013 at 05:05:12 UTC, H. S. Teoh wrote:
>> >On Sat, Aug 17, 2013 at 06:53:16AM +0200, Alan wrote:
>> >>Hello!  The past few hours I've been working on some things 
>> >>and I
>> >>came accross a small bug.
>> >>
>> >>I'm essentially practicing lexing and parsing by 
>> >>implementing a
>> >>(very) simple language.  Everything is going great so far 
>> >>(variable
>> >>declarations, writing to stdout etc...) but I have a small 
>> >>problem
>> >>with my string literals.  I've got them working fine, quotes 
>> >>can be
>> >>escaped etc... But when they include the new line character 
>> >>(\n) for
>> >>example and it's written out it doesn't create a new line 
>> >>but prints
>> >>out those characters raw.  Does anyone have any idea why?  
>> >>Any help
>> >>is very much appreciated!
>> >
>> >Which quotation marks did you use for your string literals?
>> >
>> >If you use double quotes, then it should work: "\n"
>> >
>> >But if you use the other quoting syntaxes, the \n may be 
>> >treated
>> >literally rather than as an escape sequence, e.g., `\n` is a 
>> >string
>> >of two characters '\' and 'n'.
>> >
>> >
>> >T
>> 
>> I don't think it matters how my string literals are 
>> recoginized,
>> they can be recognized by double or single quotes.
>> Either way the value is stored in a string then written out, 
>> but \n
>> is written out raw for some reason.
>
> Wait, are you talking about the language that you're parsing 
> having
> string literals that contain "\n"? If so, then you need to 
> manually
> translate them, since in the input file, they are two literal 
> character
> '\' and 'n', and the computer wouldn't know how you want to 
> interpret
> them. So you have to do something like this:
>
> 	auto parseStringLiteral(R)(R input)
> 		if (is(ElementType!R : dchar))
> 	{
> 		auto value = appender!string();
> 		while (!input.empty && input.front != '\"')
> 		{
> 			// Interpret escape sequences here
> 			if (input.front == '\\') {
> 				input.popFront();
> 				if (input.empty)
> 					throw new Exception("Unterminated escape sequence");
>
> 				switch(input.front) {
> 				case 'n':
> 					app.put("\n");
> 					break;
> 				// ... put whatever other escapes you
> 				// want to interpret here
> 				}
> 			} else {
> 				// Not an escape sequence, transcribe to
> 				// output literally.
> 				app.put(input.front);
> 			}
> 		}
> 		return value.data;
> 	}
>
> In other words, none of the escape sequences are implemented 
> for you;
> you have to implement them yourself.
>
>
> T

OH!  Yes that makes a lot of sense, thanks so much for the help!


More information about the Digitalmars-d-learn mailing list