[antlr-interest] how to skip/read next n Characters (n is read form input)

Terence Parr parrt at cs.usfca.edu
Thu Nov 15 08:34:47 PST 2012


here's a similar example from the book:

http://media.pragprog.com/titles/tpantlr2/code/tour/Data.g4
Ter
On Nov 15, 2012, at 12:46 AM, <cd.barth at t-online.de> wrote:

> Hi Thomas, 
> the sample from ANTLR v3 reference is not (yet?) running with ANTLR v4.0b3.
> (b+=CHAR)+ {$b.size()<=Integer.parseInt($NUM.text)}?
> 
> I see that {System.out.println(((StartContext)_localctx).b.size());}
> is a workaround for the counter but synpred is not working for me too.
> 
> It would be nice getting therefor a solution from Ter in the final Version.
> 
> Regards Claus-Dieter
> 
> 
> -----Ursprüngliche Nachricht-----
> Von: Thomas Ruschival [mailto:thomas at ruschival.de] 
> Gesendet: Mittwoch, 14. November 2012 21:53
> An: cd.barth at t-online.de
> Cc: 'Juancarlo Añez'; antlr-interest at antlr.org
> Betreff: Re: AW: [antlr-interest] how to skip/read next n Characters (n is read form input)
> 
> Hi,
> finally I got a (Kindle-)copy of the ANTLR reference and read some chapters.
> The cited example generates NullPointerExceptions:
> 
> Looking through the generated code I realized that 'b' is translated in Java to a List b_list = null; b_list is never initialized to be a valid object. (no b_list = new ArrayList(); anywhere in the readNchars method)
> 
> This issue I fixed manually in the generated code...
> 
> The second issue came up during runtime: an EarlyExitException is thrown.
> According to the reference is occurs if "The recognizer did not match anything for a (..)+ loop."
> This is (at least for me) quite odd. Since I also tried to match (b+=.)+ as well as (b+=CHAR)+
> 
> 
> Best regards
> Thomas
> 
> 
> 
> Am 2012-11-02 13:51, schrieb cd.barth at t-online.de:
>> Thomas, I would use validating semantic predicate
>> 
>> readNchars
>> : NUM
>>  (b+=CHAR)+ {$b.size()<=Integer.parseInt($NUM.text)}?
>> ;
>> 
>> The idea is from Ter's book The Definitive ANTLR Reference (ANTLR v3)
>> 
>> Gruß Claus-Dieter
>> 
>> 
>> -----Ursprüngliche Nachricht-----
>> Von: Juancarlo Añez [mailto:apalala at gmail.com]
>> Gesendet: Donnerstag, 1. November 2012 02:20
>> An: Thomas Ruschival
>> Cc: antlr-interest at antlr.org
>> Betreff: Re: [antlr-interest] how to skip/read next n Characters (n is 
>> read form input)
>> 
>> Thomas,
>> 
>> ANTLR may be overkill or inadequate for what you're doing.
>> 
>> I think you'd be better of with a program with a main loop that 
>> dispatches to different functions based on the escape code. Each 
>> function can affect the input position, or do anything else it 
>> pleases. It would be a handcrafted state machine.
>> 
>> You can do this in Python or any of the friendly languages.
>> 
>> Cheers,
>> 
>> -- Juancarlo
>> 
>> On Wed, Oct 31, 2012 at 12:17 PM, Thomas Ruschival
>> <thomas at ruschival.de>wrote:
>> 
>>> I am a humble EE with little grammar experience, please forgive my 
>>> ignorance and give me a hint how professionals would do the trick.
>>> 
>>> I came up with a grammar for detecting commands "escape-sequences" 
>>> in
>>> a input text (for a UnifiedPOS printer) that reads numbers and 
>>> boolean argumets for escape sequence commands from the input stream.
>>> I can read numeric arguments and use them as function parameters, 
>>> which function to be called is parsed correctly.
>>> For instance "ESC|#rF" means "print feed revers # lines"
>>> 
>>> The question is how to treat "ESC|#E" which means "send the next # 
>>> bytes untreated to the pinter" in other words:
>>> 
>>> How can I use a number N that I detected on the input stream to read 
>>> and consume the next N characters 'un-lexed' and 'un-parsed' as 
>>> string/byte array?
>>> 
>>> I was thinking using something like this in a parse action using the 
>>> 'input' member of the parser:
>>> 
>>> for (int i=0; i<N; i++){
>>>        output.append(input.LA(1));
>>>        input.consume();
>>> }
>>> 
>>> But it doesn't seem very professional to me. Furthermore this gives 
>>> me tokens and not plain bytes....
>>> Can you give me a hint?
>>> 
>>> Thanks in advance
>>> Thomas
>>> 
>>> List: http://www.antlr.org/mailman/listinfo/antlr-interest
>>> Unsubscribe:
>>> 
>>> http://www.antlr.org/mailman/options/antlr-interest/your-email-addres
>>> s
>>> 
>> 
>> 
>> 
>> --
>> Juancarlo *Añez*
> 



More information about the antlr-interest mailing list