0

I want can use array normally like: a[1]. The xbase seems not support array grammar, so i defined this myself. But this task overcome my head. Thanks.

error(211): ../org.eclipse.xtext.example.domainmodel/src-gen/org/eclipse/xtext/example/domainmodel/parser/antlr/internal/InternalDomainmodel.g:576:2: [fatal] rule ruleXExpressionOrVarDeclaration has non-LL(*) decision due to recursive rule invocations reachable from alts 2,3. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.

generate domainmodel "http://www.xtext.org/example/Domainmodel"
import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase

DomainModel:
    importSection=XImportSection?
    elements+=AbstractElement*;

AbstractElement:
    PackageDeclaration | Entity;

PackageDeclaration:
    'package' name=QualifiedName '{'
        elements+=AbstractElement*
    '}';

Entity:
    'script' name=ValidID ('extends' superType=JvmParameterizedTypeReference)? '{'
        features+=Feature*
    '}';

Feature:
    Property | Operation;

Property:
    name=ValidID ':' type=JvmTypeReference;

Operation:
    'def' name=ValidID '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' (':' type=JvmTypeReference)?
        body=XBlockExpression;

@Override 
XExpressionOrVarDeclaration returns xbase::XExpression:
    XVariableDeclaration | NpExpression | XExpression;

NpExpression returns xbase::XExpression:
     XExpression '[' INT ']'
;

NpSlice:
    {IntConstant} value=INT
;
  • 1
    NpExpression returns xbase::XExpression: {NpExpression} QualifiedName (=>'[' INT ']') ;warning(200): ../org.eclipse.xtext.example.domainmodel/src-gen/org/eclipse/xtext/example/domainmodel/parser/antlr/internal/InternalDomainmodel.g:576:2: Decision can match input such as "RULE_ID '.' RULE_ID '[' RULE_INT ']'" using multiple alternatives: 2, 3 – 杜兆喜 Nov 21 '20 at 06:02
  • I'm not an expert on Xtext, but Xtext uses Antlr3. Antlr3 does not handle any form of left recursion. Antlr4, which has been out for 8+ years, handles direct-left recursion, but not indirect-left recursion. It looks like you need to rewrite the rules for NpExpression, XExpression, XExpressionOrVarDeclaration. But, it is hard to say without seeing all of InternalDomainmodel.g. – kaby76 Nov 21 '20 at 11:17
  • Still not work, maybe xbase too complex. NJBlockExpression returns xbase::XExpression: {NJExpression} '{' (expressions+=NPExpression ';'?)* '}'; @Override XCastedExpression returns xbase::XExpression: NPExpression (=>({XCastedExpression.target=current} 'as') type=JvmTypeReference)* ; NPExpression returns xbase::XExpression: NPArrayCall =>({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])? ; NPArrayCall returns xbase::XExpression: XMemberFeatureCall => ({Array.left = current} '[' index=INT ']')* ; – 杜兆喜 Nov 21 '20 at 14:14

0 Answers0