[antlr-interest] Help on /*empty command*/ ; ; ; ;

Raphael Reitzig r_reitzi at cs.uni-kl.de
Sat Jul 12 03:20:14 PDT 2008


Hi!

If you do not need semicolons at all and do not want to process empty
statements in any way either, something like

sql_single : sql_statement (SEMI)*;

should also do the job. I assume you already ignore \n and comrades in your
lexer rules so those should come in your way.

Regards

Raphael

On Sat, 12 Jul 2008 15:06:03 +1000, "Thomas Brandon" <tbrandonau at gmail.com>
wrote:
> On Sat, Jul 12, 2008 at 2:54 PM, Ruslan Zasukhin
> <sunshine at public.kherson.ua> wrote:
>> On 7/12/08 12:37 AM, "Chris Rebert" <cvrebert at gmail.com> wrote:
>>
>> Hi Chris,
>>
>>> I'm a newbie, but i think the possible lookahead through sql_statement
>>> might be the problem.
>>> Have you tried:
>>>
>>> sql_single
>>>    : sql_statement? SEMI
>>>    ;
>>
>> Not yet, and I think this will bring performance troubles.
>>
>> I know that such empty commands are allowed e.g. In C++.
>> I have take C++ grammars, and later realize why in SQL I have problems.
>>
>> * because in C++ SEMI must present.
>> * but in SQL it MAY present.
>>
>> So in SQL I need something as
>>
>> sql_single
>>    :    SEMI
>>    |    statement (SEMI)?
>>
>> But  this not works also...
>>
>> I think because ANTLR cannot differ when add SEMI to second branch, and
> when
>> it is really just SEMI.
> Is this a problem? ANTLR3 will issue a warning but it should work as
> desired matching the optional SEMI if possible. I thought ANTLR2 would
> do the same but it's been awhile.
> Otherwise you could do:
> sql_single
>     :    SEMI
>     |    statement
> Assuming you don't need to include the SEMI in the tree this should be
ok.
> Otherwise you would need to add a predicate to the optional SEMI or
> (maybe) make it greedy.
> 
> Tom.
>>
>> Still playing.
>>
>>
>>> Best of luck,
>>> Chris
>>>
>>> On Fri, Jul 11, 2008 at 4:58 AM, Ruslan Zasukhin
>>> <sunshine at public.kherson.ua> wrote:
>>>> Hi All,
>>>>
>>>> I try implement on ANTLR 2.7 the empty command for SQL.
>>>> So parser will eat something as
>>>>
>>>> CREATE TABLE T(f1 int);
>>>> ;
>>>> ;
>>>>
>>>>
>>>> Can somebody show quick draft of such rule?
>>>>
>>>> This my attempt not works as expected.
>>>>
>>>>
>>>> sql
>>>>    :  (sql_single)*  EOF
>>>>    ;
>>>>
>>>> sql_single
>>>>    : sql_staement  (SEMI)?
>>>>    | SEMI
>>
>>
>> --
>> Best regards,
>>
>> Ruslan Zasukhin
>> VP Engineering and New Technology
>> Paradigma Software, Inc
>>
>> Valentina - Joining Worlds of Information
>> http://www.paradigmasoft.com
>>
>> [I feel the need: the need for speed]
>>
>>
>>



More information about the antlr-interest mailing list