[antlr-interest] Incompatible type in subrules with OR
Gary Miller
gary at sumwise.com
Tue Jul 26 03:45:26 PDT 2011
Hey Claudio,
It was no inconvenience, I was just hoping that others more experienced then
me could also help.
After type this email I think your problem is point (4), your interpretation
of
rule : v=a | v=b -> ^(X $v);
I think this means
rule : a -> a | b -> ^(X b);
You probably meant to write
rule : a -> ^(X a) | b -> ^(X b);
The rests of this email is probably just commentary.
Regards
Gary
Your grammar looks quite odd to me in a number of ways.
1. I have found that it help me to split my lexer and parser.
The result of this is that a lot of your parser rules as they stand would
be invalid.
I think the main reason I do this is that I get easily confused by
lexing.
2. I do have assignments in my token sections.
i.e.
token { A = 'a'; }
only virtual token definitions
token { A; }
3. I would try for a more generic function definition and deal with function
validation later e.g. in a walker.
eg.
function : name=STRING LPAREN (arg=STRING)* RPAREN -> ^(FUNC $name
$arg)
4. Your OR look strange, as far as I know every OR (make not the one in
bracket, but I'm not sure need a rewrite or AST production)
I think the following is wrong
rule : foo | bar | lalala -> ^(X xyz)
This might mean (experts please help here)
rule
: foo -> foo
| bar -> bar
| lalala -> ^(X xyz)
;
I think you probably wanted
rule
: foo -> ^(X xyz)
| bar -> ^(X xyz)
| lalala -> ^(X xyz)
;
Hope this helped.
On Tue, Jul 26, 2011 at 7:50 PM, Claudio Martella <
claudio.martella at tis.bz.it> wrote:
> Hi Gary,
>
> sorry for the inconvenience about the direct email, realized about the
> reply_to only after I clicked.
> Actually I did fix that cardinality yesterday before your suggestion,
> but the problem persists.
> I also tried to restructure my grammar as you suggest but I'm still
> finding the same trouble and sincerely I'm running out of options...
>
> For example locationStep is now:
>
> locationStep
> : edge condition*
> -> ^(LOCATIONSTEP edge condition*)
> | edge condition* repeat
> -> ^(LOCATIONSTEP edge condition* repeat)
> | edge condition* shortestPath
> -> ^(LOCATIONSTEP edge condition* shortestPath);
>
> To get rid of condition* I'd have to restructure everything with a
> recursive definition of condition, but that doesn't feel like the right
> thing to do or a reason why things would start working.
>
>
> My grammar in the end is very simple and I really don't know how to
> proceed to fix this.
>
> Any suggestion about what I should read?
>
>
> On 7/26/11 1:16 AM, Gary Miller wrote:
> > Hey Claudio,
> >
> > Please try to remember to reply to the list and not directly to the
> > person. Unfortunately this list server doesn't add a reply_to in the
> > header.
> >
> > I'm guessing that you problem is one of cardinality.
> > The cardinality on the left and right should generally match.
> > I would go as far as saying that you might want to restructure your
> > grammar so that they always match (I'm not sure if this is actually
> > possible though).
> >
> > So
> > � r�
> > � : a c -> (A c)
> > � | a b -> (A b)
> > � ;
> > is preferable to
> > � r
> > � : a (c | b) -> (A c? b?)
> > � ;
> > IMO.
> >
> > I'm guessing your mistake is here
> > � � locationStep: edge condition* (repeat | shortestPath)?
> > � � � -> ^(LOCATIONSTEP condition? repeat? shortestPath?);
> > as condition has a * on the left and a ? on the right.
> > Try
> > � � locationStep: edge condition* (repeat | shortestPath)?
> > � � � -> ^(LOCATIONSTEP condition* repeat? shortestPath?);
> > And look for any other mismatches.
> >
> > Regards
> > Gary
> >
> > On Tue, Jul 26, 2011 at 12:23 AM, Claudio Martella
> > <claudio.martella at tis.bz.it <mailto:claudio.martella at tis.bz.it>> wrote:
> >
> > I applied (1) and it worked. I have one problem with this grammar
> > though. I'm debugging it with ANTLRWorks and the generated Parse
> > Tree is
> > correct. The problem is that when I visualize the AST some things
> > don't
> > work. In particular the filterFunction internal node is not always
> > present. Sometimes the filter node has a direct child "PREFIX("
> > and the
> > token ')' is still present instead of being discarded. I don't
> > understand how this can be possible as the Parse Tree is correct
> > AND for
> > certain examples the AST for filter is also correct.
> >
> > To replicate it try the query "claudio :: age [MAX(10)][MIN(3)] > age
> > [country = EQUALS('italy')] > weight [MIN(3)] (*3)
> .DISTANCE('marco')"
> >
> > with this grammar:
> > grammar RDFPath;
> >
> > options { output = AST; }
> > tokens {
> > � �QUERY � � � � � = 'query';
> > � �LOCATIONSTEP � �= 'locationstep';
> > � �CONDITION � � � = 'condition';
> > � �FILTER � � � � �= 'filter';
> > � �FILTERFUNCTION �= 'filterfunction';
> > � �SUBQUERY � � � �= 'subquery';
> > � �REPEAT � � � � �= 'repeat';
> > � �SHORTESTPATH � �= 'shortestpath';
> > � �ENDNODEFUNCTION = 'endnodefunction';
> > � �STARTNODE � � � = 'startnode';
> > � �EDGE � � � � � �= 'edge';
> > }
> >
> > /* PARSER RULES */
> >
> > query: startNode '::' locationStep ('>' locationStep)* ('.'
> > endNodeFunction)?
> > � �-> ^(QUERY startNode locationStep+ endNodeFunction);
> >
> > locationStep: edge condition* (repeat | shortestPath)?
> > � -> ^(LOCATIONSTEP condition? repeat? shortestPath?);
> >
> > condition: '[' ( filter | subquery ) ']'
> > � -> ^(CONDITION filter? subquery?);
> >
> >
> > filter: filterFunction
> > � �-> ^(FILTER filterFunction);
> >
> > filterFunction: fn='EQUALS(' v=STRING ')' | fn='EQUALS('
> > v=INTVALUE ')'
> > � � � �| fn='SUFFIX(' v=STRING ')' | fn='PREFIX(' v=STRING ')'
> > � � � �| fn='MIN(' v=INTVALUE ')' | fn='MAX(' v=INTVALUE ')'
> > � �-> ^(FILTERFUNCTION $fn $v);
> >
> > subquery: edge '=' filterFunction
> > � �-> ^(SUBQUERY edge filterFunction);
> >
> > repeat: '(' v=INTVALUE ')'
> > � �-> ^(REPEAT $v);
> >
> > shortestPath: '(*' v=INTVALUE ')'
> > � �-> ^(SHORTESTPATH $v);
> >
> > endNodeFunction: fn='COUNT()' | fn='SUM()' | fn='AVG()'
> > � � � � � � | fn='MIN()' | fn='MAX()' | fn='DISTANCE(' v=STRING ')'
> > � � � �-> ^(ENDNODEFUNCTION $fn $v);
> >
> > startNode: v='*' | v=TEXTVALUE
> > � �-> ^(STARTNODE $v);
> >
> > edge: v=TEXTVALUE
> > � �-> ^(EDGE $v);
> >
> > /* LEXER RULES */
> >
> > TEXTVALUE: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')* ;
> >
> > INTVALUE: ('0'..'9')+ ;
> >
> > STRING � �: '\'' TEXTVALUE '\'' ;
> >
> > ID: � �('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
> >
> > WS: � (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;};
> >
> >
> >
> > On 7/22/11 2:10 AM, Gary Miller wrote:
> > > Try the following options.
> > >
> > > 1.
> > > locationStep: edge condition? (repeat | shortestPath)? ('>'
> > locationStep)?
> > > � �-> ^(LOCATIONSTEP condition? repeat? shortestPath?
> > locationStep?);
> > >
> > > condition: ( filter | subquery ) condition?
> > > � �-> ^(CONDITION filter? subquery? condition?);
> > >
> > > or
> > > 2.
> > > locationStep
> > > : �edge condition? repeat? �('>' locationStep)? �-> ^(LOCATIONSTEP
> > > condition? shortestPath? locationStep?)
> > > | �edge condition? shortestPath? ('>' locationStep)? �->
> > > ^(LOCATIONSTEP condition? shortestPath? locationStep?)
> > > ;
> > >
> > > condition
> > > : filter condition? � -> ^(CONDITION filter condition?)
> > > | subquery condition? � -> ^(CONDITION subquery condition?)
> > > ;
> > >
> > > Regards
> > > Gary
> > >
> > >
> > > On Thu, Jul 21, 2011 at 9:16 PM, Claudio Martella
> > > <claudio.martella at tis.bz.it <mailto:claudio.martella at tis.bz.it>>
> > wrote:
> > >> Hello,
> > >>
> > >> I've this grammar: http://pastebin.com/dNzdGx8R but i get this
> > error
> > >> when I test it with AntlrWorks:
> > >>
> > >> [11:23:59] /Users/hammer/output/RDFPathParser.java:383:
> > incompatible types
> > >> [11:23:59] found � : RDFPathParser.repeat_return
> > >> [11:23:59] required: RDFPathParser.shortestPath_return
> > >> [11:23:59] � � � � � � � � � � v=repeat();
> > >> [11:23:59] � � � � � � � � � � � � � � ^
> > >> [11:23:59] /Users/hammer/output/RDFPathParser.java:586:
> > incompatible types
> > >> [11:23:59] found � : RDFPathParser.filter_return
> > >> [11:23:59] required: RDFPathParser.subquery_return
> > >> [11:23:59] � � � � � � � � � � v=filter();
> > >> [11:23:59] � � � � � � � � � � � � � � ^
> > >> [11:23:59] 2 errors
> > >>
> > >>
> > >> Basically I think the problem is the assignment in the subrules
> > with ORs
> > >> in two statements:
> > >>
> > >> locationStep: edge condition? (v=repeat | v=shortestPath)? ('>'
> > >> locationStep)?
> > >> � �-> ^(LOCATIONSTEP condition $v locationStep);
> > >>
> > >> condition: ( v=filter | v=subquery ) condition?
> > >> � �-> ^(CONDITION $v condition);
> > >>
> > >> How do I handle these situations where I have the two or more
> > options in
> > >> a subrule?
> > >>
> > >>
> > >> Thanks
> > >> Claudio
> > >>
> > >> --
> > >> Claudio Martella
> > >> Free Software & Open Technologies
> > >> Analyst
> > >>
> > >> TIS innovation park
> > >> Via Siemens 19 | Siemensstr. 19
> > >> 39100 Bolzano | 39100 Bozen
> > >> Tel. +39 0471 068 123 <tel:%2B39%200471%20068%20123>
> > >> Fax �+39 0471 068 129 <tel:%2B39%200471%20068%20129>
> > >> claudio.martella at tis.bz.it <mailto:claudio.martella at tis.bz.it>
> > http://www.tis.bz.it
> > >>
> > >> Short information regarding use of personal data. According to
> > Section 13 of Italian Legislative Decree no. 196 of 30 June 2003,
> > we inform you that we process your personal data in order to
> > fulfil contractual and fiscal obligations and also to send you
> > information regarding our services and events. Your personal data
> > are processed with and without electronic means and by respecting
> > data subjects' rights, fundamental freedoms and dignity,
> > particularly with regard to confidentiality, personal identity and
> > the right to personal data protection. At any time and without
> > formalities you can write an e-mail to privacy at tis.bz.it
> > <mailto:privacy at tis.bz.it> in order to object the processing of
> > your personal data for the purpose of sending advertising
> > materials and also to exercise the right to access personal data
> > and other rights referred to in Section 7 of Decree 196/2003. The
> > data controller is TIS Techno Innovation Alto Adige, Siemens
> > Street n. 19, Bolzano. You can find the complete information on
> > the web si
> > >> �te www.tis.bz.it <http://www.tis.bz.it>.
> > >>
> > >>
> > >>
> > >>
> > >>
> > >> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> > >> Unsubscribe:
> >
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> > >>
> > > List: http://www.antlr.org/mailman/listinfo/antlr-interest
> > > Unsubscribe:
> >
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> > >
> >
> >
> > --
> > Claudio Martella
> > Free Software & Open Technologies
> > Analyst
> >
> > TIS innovation park
> > Via Siemens 19 | Siemensstr. 19
> > 39100 Bolzano | 39100 Bozen
> > Tel. +39 0471 068 123 <tel:%2B39%200471%20068%20123>
> > Fax �+39 0471 068 129 <tel:%2B39%200471%20068%20129>
> > claudio.martella at tis.bz.it <mailto:claudio.martella at tis.bz.it>
> > http://www.tis.bz.it
> >
> > Short information regarding use of personal data. According to
> > Section 13 of Italian Legislative Decree no. 196 of 30 June 2003,
> > we inform you that we process your personal data in order to
> > fulfil contractual and fiscal obligations and also to send you
> > information regarding our services and events. Your personal data
> > are processed with and without electronic means and by respecting
> > data subjects' rights, fundamental freedoms and dignity,
> > particularly with regard to confidentiality, personal identity and
> > the right to personal data protection. At any time and without
> > formalities you can write an e-mail to privacy at tis.bz.it
> > <mailto:privacy at tis.bz.it> in order to object the processing of
> > your personal data for the purpose of sending advertising
> > materials and also to exercise the right to access personal data
> > and other rights referred to in Section 7 of Decree 196/2003. The
> > data controller is TIS Techno Innovation Alto Adige, Siemens
> > Street n. 19, Bolzano. You can find the complete information on
> > the web site www.tis.bz.it <http://www.tis.bz.it>.
> >
> >
> >
> >
> >
>
>
> --
> Claudio Martella
> Free Software & Open Technologies
> Analyst
>
> TIS innovation park
> Via Siemens 19 | Siemensstr. 19
> 39100 Bolzano | 39100 Bozen
> Tel. +39 0471 068 123
> Fax +39 0471 068 129
> claudio.martella at tis.bz.it http://www.tis.bz.it
>
> Short information regarding use of personal data. According to Section 13
> of Italian Legislative Decree no. 196 of 30 June 2003, we inform you that we
> process your personal data in order to fulfil contractual and fiscal
> obligations and also to send you information regarding our services and
> events. Your personal data are processed with and without electronic means
> and by respecting data subjects' rights, fundamental freedoms and dignity,
> particularly with regard to confidentiality, personal identity and the right
> to personal data protection. At any time and without formalities you can
> write an e-mail to privacy at tis.bz.it in order to object the processing of
> your personal data for the purpose of sending advertising materials and also
> to exercise the right to access personal data and other rights referred to
> in Section 7 of Decree 196/2003. The data controller is TIS Techno
> Innovation Alto Adige, Siemens Street n. 19, Bolzano. You can find the
> complete information on the web site www.tis.bz.it.
>
>
>
>
>
> 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