[antlr-interest] Reading a string of fixed size

Edwards, Waverly Waverly.Edwards at genesys.com
Mon Aug 27 03:24:34 PDT 2007


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




More information about the antlr-interest mailing list