[antlr-interest] Reading a string of fixed size

Edwards, Waverly Waverly.Edwards at genesys.com
Mon Aug 27 09:32:08 PDT 2007


 
Unfortunately I am not comprehending what you want to do.
You just want to get rid of the number and the colon?

If you want to change the text associated with the rule you
can use setText( String );

 CAMI_STRING2   : Number ':' AlphaNumStr
     {
         String fixLenStr  = $AlphaNumStr.text;
         setText( fixLenStr );
         setText( $AlphaNumStr.text.toString( ) ); // or may be just this [UNTESTED]

     };


W.

-----Original Message-----
From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-bounces at antlr.org] On Behalf Of Alexandre Hamez
Sent: Monday, August 27, 2007 12:02 PM
To: antlr-interest at antlr.org
Subject: Re: [antlr-interest] Reading a string of fixed size

Thanks for your interest. But the fact is that I want to create a Token with exactly NUMBER characters. The following characters will match for other token. It's not an error if there are characters which follow. Its mean that I can have something like that:

	CAMI_STRING (',' CAMI_STRING)*

( for newcomers: CAMI_STRING : NUMBER ':' STRING where the size of STRING is given by NUMBER).


Moreover, as a strange side effect of the following code, newlines make the parser completely mad:

> CAMI_STRING
> 	:
> 	NUMBER ':'
> 	{
> 		// Get the current position in stream
> 		int start  = input.getCharPositionInLine();
> 		// Computing the position of the last character of the STRING to be 
> read
> 		int end = start + Integer.parseInt($NUMBER.text) - 1;
> 		// Set the value of the returned value to STRING
> 		setText(input.substring(start,end));
> 		// Update the position in the stream
> 		input.seek(end+1);
> 	}
> 	;




On 27 août 07, at 12:24, Edwards, Waverly wrote:

> I gave it another chance, not knowing you could used rules as  
> variables.  Here is something a little more terse CAMI_STRING2  
> though I generate an error which I don't understand how to get rid  
> of.  It didn't happen in the CAMI_STRING version.
>
> The error:
> line 1:0 required (...)+ loop did not match anything at input  
> '5:abcde'
>
>
> W.
>
> grammar  TESTCAMISTRING;
>
> fragment
> Letter        :	'a'..'z' | 'A'..'Z' ;
> 	
> fragment	
> Digit	      :	'0'..'9' ;
>
> fragment
> AlphaNum      :	Letter | Digit ;
>
> fragment
> Number        : Digit+ ;
>
> fragment
> AlphaNumStr   : Letter AlphaNum* ;
>
>
> prog	      :	start+ ;
>
> start         : CAMI_STRING2
>               ;
> NEWLINE	:	('\r\n'|'\r'|'\n') ;
>
>
> // works just fine but is not as efficient or terse as CAMI_STRING2	
> CAMI_STRING   : Digit+ ':' Letter AlphaNum*
>     {
>         String wholeStr,numStr,fixLenStr;
>         int colonLoc, num;
>         boolean validate;
>
>         wholeStr  = getText().toString();
>         colonLoc  = wholeStr.indexOf(":");
>         numStr    = wholeStr.substring(0, colonLoc);
>         num       = Integer.parseInt(numStr);
>         fixLenStr = wholeStr.substring(colonLoc+1);
>         validate  = (num == fixLenStr.length() );
>         if ( validate == true )
>             System.out.println(numStr + "," + fixLenStr );
>         else
>             System.out.println("ERROR: num:Str length mismatch");
>     };
>
>
> CAMI_STRING2   : Number ':' AlphaNumStr
>     {
>         int num           = Integer.parseInt($Number.text);
>         String fixLenStr  = $AlphaNumStr.text;
>         boolean validate  = (num == fixLenStr.length() );
>         if ( validate == true )
>             System.out.println( num + "," + fixLenStr );
>         else
>             System.out.println("ERROR: num:Str length mismatch");
>     };
>
>
> -----Original Message-----
> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest- 
> bounces at antlr.org] On Behalf Of Edwards, Waverly
> Sent: Monday, August 27, 2007 5:53 AM
> To: antlr-interest at antlr.org
> Subject: Re: [antlr-interest] Reading a string of fixed size
>
>
> Here is something that is functional.
>
> I'm a newbie at all of this, ANTLR and Regular expressions so don't  
> take this as the Gospel.  You'll want to check this out carefully.
>
> I didn't even know you could do this:  Integer.parseInt($NUMBER.text)
>
> If you can, this code could be shorter and I will have learned  
> something else useful.
>
>
> W.
>
>
>
> grammar  TESTCAMISTRING;
>
> fragment
> Letter        :	'a'..'z' | 'A'..'Z' ;
> 	
> fragment	
> Digit	      :	'0'..'9' ;
>
> fragment
> AlphaNum      :	Letter | Digit ;
>
> prog	      :	start+ ;
>
> start         : CAMI_STRING
>               ;
> NEWLINE	:	('\r\n'|'\r'|'\n') ;
>
> 	
> CAMI_STRING   : Digit+ ':' Letter AlphaNum*
>     {
>         String wholeStr,numStr,fixLenStr;
>         int colonLoc, num;
>         boolean validate;
>
>         wholeStr  = getText().toString();
>         colonLoc  = wholeStr.indexOf(":");
>         numStr    = wholeStr.substring(0, colonLoc);
>         num       = Integer.parseInt(numStr);
>         fixLenStr = wholeStr.substring(colonLoc+1);
>         validate  = (num == fixLenStr.length() );
>         if ( validate == true )
>             System.out.println(numStr + "," + fixLenStr);
>         else
>             System.out.println("ERROR: num:Str length mismatch");
>     };
>
>
> -----Original Message-----
> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest- 
> bounces at antlr.org] On Behalf Of Alexandre Hamez
> Sent: Monday, August 27, 2007 3:33 AM
> To: antlr-interest at antlr.org
> Subject: [antlr-interest] Reading a string of fixed size
>
> Hi everybody,
>
> 	I need to read a string of a fixed size. For example : '5:abcde'.
> The size of the string to be read is given by the number before the  
> ':'. So I've written the following:
>
> CAMI_STRING
> 	:
> 	NUMBER ':'
> 	{
> 		// Get the current position in stream
> 		int start  = input.getCharPositionInLine();
> 		// Computing the position of the last character of the STRING to  
> be read
> 		int end = start + Integer.parseInt($NUMBER.text) - 1;
> 		// Set the value of the returned value to STRING
> 		setText(input.substring(start,end));
> 		// Update the position in the stream
> 		input.seek(end+1);
> 	}
> 	;
> 	
> NUMBER	
> 	: 	
> 	'0'..'9'+
> 	;
>
>
> It works quite well until the string to be read contains a number  
> itself. Have you an idea on this problem? Thanks for you help!
>
>
> ---------------------------------------------------------------------- 
> --
> ---
> Alexandre Hamez   LIP6 - MoVe / EPITA - LRDE
> LIP6: tel: +33 1 44 27 31 92  / Bureau 818
> 104 Avenue du Président Kennedy 75016 Paris http://www-src.lip6.fr/ 
> ~Alexandre.Hamez
>
>
>

------------------------------------------------------------------------ 
---
Alexandre Hamez   LIP6 - MoVe / EPITA - LRDE
LIP6: tel: +33 1 44 27 31 92  / Bureau 818
104 Avenue du Président Kennedy 75016 Paris
http://www-src.lip6.fr/~Alexandre.Hamez




More information about the antlr-interest mailing list