On 7/25/11 4:23 PM, Claudio Martella 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
>> <[email protected]> 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
>>> Fax +39 0471 068 129
>>> [email protected] 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 [email protected] 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 we
b si
>>> te 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
Fax +39 0471 068 129
[email protected] 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 [email protected] 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.
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--
You received this message because you are subscribed to the Google Groups
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/il-antlr-interest?hl=en.