[antlr-interest] delimited param lists

Goran antlr at raf.hr
Tue Jul 12 23:30:56 PDT 2005


Hi,

thanks for adding a subject, I plan to do so, but at the beginning I 
didn't know what to put there, and later .... , my fingers was faster 
then me, so sorry for subject, and thanks for suggestions
I'll try that

Goran

Chris Black wrote:

> Goran wrote:
>
>> Hi,
>
>
> Hello! I took the liberty of supplying a subject to make the thread 
> easier to track for others.
>
>> first I must say that I'm beginner in ANTLR (I writte few minor 
>> projects so far, but nothing complicated), so please forgive me on 
>> this question but, I just don't get it.
>> I have old assembler written manualy, and now I want to transfer it 
>> to ANTLR, so, among other things I have situation like this:
>>
>> Possible source combination:
>>     1.    aaa                        ; just mnemonic
>>     2.    aaa param              ; mnemonic and one param
>>     3.    aaa param, param   ; mnemonic and two params
>>
>> when I write down following
>> /
>> /
>>
>>     /statement
>>         : mnemonic (paramBlock)?
>>         ;  
>>     paramBlock
>>         : expression (COMMA expression)?
>>         ;
>>     /
>>
>> parser does recognize options 2 and 3, but when I write
>> /
>> /
>>
>>     /statement
>>         : mnemonic (paramBlock)*
>>         ;  
>>     paramBlock
>>         : expression (COMMA expression)*
>>         ;
>>     /
>>
>> parser passes but on second statement (for example if I have 1 
>> following 2) he does not recognise aaa as mnemonic but as identifier.
>> So, I'm comfused with (xxx)? thas this means 0 or 1 (because this is 
>> not functioning that way) or I miss something (what is probably the 
>> case :-) )
>>
>> I'm using ANTLR 2.5.7 and K=2
>
>
> I'm guessing you are actually using 2.7.5 and the 2.5.7 was a typo...
>
> Anyway, you are correct on ? and *. ? means 0 or 1 (or "optional"), * 
> is 0 or more, and + is 1 or more.
> As for why your parser isn't working I'm not quite sure. My initial 
> suspicion is that the parser does not know when to end the loop that 
> can match any number of paramBlocks or (COMMA expression)*. The parser 
> needs a way of knowing when to stop matching a rule that has * or +. 
> This can be a bit tricky and sometimes requires predicates, but 
> usually it is something as easy as matching an end of line or end of 
> statement token:
>
> statement: mnemonic (paramBlock)* NEWLINE;
>
> Another thing I just noticed is that you probably don't need a * on 
> both the paramBlock match in statement AND the (COMMA expression) part 
> inside the paramBlock rule. The way it is now is you are saying a 
> statement is a mnemonic followed by ANY NUMBER of paramBlocks, AND a 
> paramBlock itself can contain ANY NUMBER of expressions.
>
> Anyway, just a few tips, hope they help.
> Chris
>
>
>




More information about the antlr-interest mailing list