[antlr-interest] How can I avoid "mismatched input" error?

Johannes Luber jaluber at gmx.de
Tue Mar 24 05:09:12 PDT 2009


Gabriel Petrovay schrieb:
> Hi all,
> 
> I am trying to parse XQuery.

Did you see this link? <http://code.google.com/p/xqpretty/>

Johannes

> It is known that XQuery is not keyword
> based. For example you can have the following function declaration:
> 
> declare function declare:function($declare as element(declare)) as
> element(function) {
>   <function declare="declare function">{$declare/function}</function>
> }
> 
> This declares a function called "function" in the namespace that has the
> prefix "declare". This function takes the parameter "declare" of type
> XML element having the tag name "declare", and returns also an XML
> element having the tag name "function". And so forth...
> :)
> 
> Can I solve this?
> 
> Thanks!
> Gabriel
> 
> On Tue, Mar 24, 2009 at 10:46 AM, Indhu Bharathi <indhu.b at s7software.com
> <mailto:indhu.b at s7software.com>> wrote:
> 
>     I assume when you say 'keyword' you are talking about the keywords
>     (like 'if', 'else'. 'type', etc) in the language you are trying to
>     parse. Those must be finite and the regular approach is to have a
>     production for each. Under that assumption the proposed model is
>     certainly scalable.
> 
>     But I'm just getting a doubt if you are meaning something else by
>     'keyword'. Are you trying to parse a input containing name value
>     pair where name and value can be anything?
> 
>     And what do you mean by Name1, Name2, ... NameN? I dont see any such
>     thing in grammar. Is name not a plain ID (like a variable name)?
> 
>     Throwing some more light on what exactly you are trying to parse
>     will be helpful.
> 
> 
>     - Indhu
> 
>     Gabriel Petrovay wrote:
>>     Hi Indhu,
>>
>>     I was trying to simplify the example such that I still get the
>>     error and the example is simple enough for everybody to understand
>>     the problem.
>>
>>     Here is the corrected grammar:
>>
>>     //========================================
>>     grammar k;
>>     options {
>>     output=AST;
>>     }
>>
>>     rule : KEYWORD1 (KEYWORD2 Name)? ';' ;
>>
>>     KEYWORD1 : 'keywordA';
>>     KEYWORD2 : 'keywordB';
>>
>>     Name : ('a'..'z' | 'A'..'Z')+ ;
>>     S : ('\t' | ' ' | '\n' | '\r')+  { $channel = HIDDEN; } ;
>>     //========================================
>>
>>     With this the problems you mentioned are eliminated.
>>
>>     As I can see your proposed solution is not scalable if I have the
>>     keywords: keywordA, keywordB,...,keywordZ, and the Name rules:
>>     Name1, Name2,..., NameN. Or is it?
>>
>>     Any solution for this?
>>
>>
>>     Regards,
>>     Gabriel
>>
>>
>>     On Tue, Mar 24, 2009 at 9:29 AM, Indhu Bharathi
>>     <indhu.b at s7software.com <mailto:indhu.b at s7software.com>> wrote:
>>
>>         Looks like you are trying to use keyword as identifier. AFAIK,
>>         this cannot be resolved in the lexer. You have to use
>>         predicates in the parser rule. Something like this:
>>
>>         rule : keyKEYWORD1 (keyKEYWORD2 enc=Name)? ';' ;
>>
>>         keyKEYWORD1
>>             :    {input.LT(1).getText().equals("keyword1")}? Name ;
>>
>>         keyKEYWORD2
>>             :    {input.LT(1).getText().equals("keyword2")}? Name ;
>>
>>
>>         One more problem I see is the production "Name : Letter* ;".
>>         Lexer production cannot define a zero length string.
>>
>>         Another problem is you are expecting 'keyword1' to be parsed
>>         as Name but production for Name doesn't allow numbers.
>>
>>         - Indhu
>>
>>         Gabriel Petrovay wrote:
>>>         Hi all,
>>>
>>>         I have the following grammar file:
>>>
>>>         //========================================
>>>         grammar k;
>>>         options {
>>>         output=AST;
>>>         }
>>>
>>>         rule : KEYWORD1 (KEYWORD2 enc=Name)? ';' ;
>>>
>>>         KEYWORD1 : 'keyword1';
>>>         KEYWORD2 : 'keyword2';
>>>
>>>         Name : Letter* ;
>>>         fragment Letter : 'a'..'z' | 'A'..'Z' ;
>>>
>>>         S            :    ('\t' | ' ' | '\n' | '\r')+  { $channel =
>>>         HIDDEN; } ;
>>>         //========================================
>>>
>>>
>>>         The following text is not a valid one.
>>>
>>>         INPUT:
>>>         =====
>>>         keyword1 keyword2 keyword1 ;
>>>
>>>         OUTPUT:
>>>         =======
>>>         line 1:18 mismatched input 'keyword1' expecting Name
>>>         <mismatched token: [@4,18:25='keyword1',<4>,1:18],
>>>         resync=keyword1 keyword2 keyword1 ;>
>>>
>>>
>>>         How can I make a parser to recognize this input? I want to be
>>>         able to allow the keywords in the places where any char
>>>         combination is allowed. How can I make this?
>>>
>>>         Regards,
>>>         Gabriel
>>>         ------------------------------------------------------------------------
>>>
>>>
>>>         List: http://www.antlr.org/mailman/listinfo/antlr-interest
>>>         Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>>>           
>>
>>
>>
>>
>>     -- 
>>     MSc Gabriel Petrovay
>>     MCSA, MCDBA, MCAD
>>     Mobile: +41(0)787978034
> 
> 
> 
> 
> -- 
> MSc Gabriel Petrovay
> MCSA, MCDBA, MCAD
> Mobile: +41(0)787978034
> 
> 
> ------------------------------------------------------------------------
> 
> 
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address



More information about the antlr-interest mailing list