简体   繁体   中英

Xtext is not producing a complete class from my dsl

I have an xtext grammar that I am planning to use in an application. However, when I inspect the generated classes some items are missing.

Here is the grammar:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model:
    model += ModelBlock+
;
ModelBlock:
    SystemBlock | DataSetBlock | RelationshipBlock
;
SystemBlock:
    'Systems' systemGroup=ID
    systems+=System+
;
DataSetBlock:
    'DataSets' datasetGroup=ID
    datasets+=DataSet+
    ;
RelationshipBlock:
    'Relationships' relationshipGroup=ID
    relationships+=Relationship+
;   
System:
    name = ID ':'
        'name:' nm = STRING
        ('description:' description = STRING)?
;
DataSet:
    name = ID ':'
        'name:' nm = STRING
;
Function:
    name = ID ':'
    'name:' nm = STRING
;
Relationship:
    SystemCONNECTSSystem |
    SystemCONSUMESDataSet | 
    SystemPRODUCESDataSet
;
SystemCONNECTSSystem:
    rel=ID 
        ':' lhs = [System] 
        'CONNECTS' rhs = [System] 
;
SystemCONSUMESDataSet:
    rel=ID ':' lhs = [System] 'CONSUMES' rhs = [DataSet] 
    ('WITH' 'frequency:' frequency = INT)?
;           
SystemPRODUCESDataSet:
    rel=ID ':' lhs = [System] 'PRODUCES' rhs = [DataSet] 
    ('WITH' 'frequency:' frequency = INT 
        ('risk:' risk = RiskEnum)?
    )?
;           
enum RiskEnum:
    h="high" | m="med" | l="low"
;

You will notice that the classes SystemCONNECTSSystem, SystemPRODUCESDataSet and SystemCONSUMESDataSet are not generating the attribute lhs, but are generating the attribute rhs. See SystemPRODCUESDataSet below, the others have the same problem.

/**
 */
package org.xtext.example.mydsl.myDsl;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>System PRODUCES Data Set</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.xtext.example.mydsl.myDsl.SystemPRODUCESDataSet#getRhs <em>Rhs</em>}</li>
 *   <li>{@link org.xtext.example.mydsl.myDsl.SystemPRODUCESDataSet#getFrequency <em>Frequency</em>}</li>
 *   <li>{@link org.xtext.example.mydsl.myDsl.SystemPRODUCESDataSet#getRisk <em>Risk</em>}</li>
 * </ul>
 *
 * @see org.xtext.example.mydsl.myDsl.MyDslPackage#getSystemPRODUCESDataSet()
 * @model
 * @generated
 */
public interface SystemPRODUCESDataSet extends Relationship
{
  /**
   * Returns the value of the '<em><b>Rhs</b></em>' reference.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Rhs</em>' reference isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Rhs</em>' reference.
   * @see #setRhs(DataSet)
   * @see org.xtext.example.mydsl.myDsl.MyDslPackage#getSystemPRODUCESDataSet_Rhs()
   * @model
   * @generated
   */
  DataSet getRhs();

  /**
   * Sets the value of the '{@link org.xtext.example.mydsl.myDsl.SystemPRODUCESDataSet#getRhs <em>Rhs</em>}' reference.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Rhs</em>' reference.
   * @see #getRhs()
   * @generated
   */
  void setRhs(DataSet value);

  /**
   * Returns the value of the '<em><b>Frequency</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Frequency</em>' attribute isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Frequency</em>' attribute.
   * @see #setFrequency(int)
   * @see org.xtext.example.mydsl.myDsl.MyDslPackage#getSystemPRODUCESDataSet_Frequency()
   * @model
   * @generated
   */
  int getFrequency();

  /**
   * Sets the value of the '{@link org.xtext.example.mydsl.myDsl.SystemPRODUCESDataSet#getFrequency <em>Frequency</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Frequency</em>' attribute.
   * @see #getFrequency()
   * @generated
   */
  void setFrequency(int value);

  /**
   * Returns the value of the '<em><b>Risk</b></em>' attribute.
   * The literals are from the enumeration {@link org.xtext.example.mydsl.myDsl.RiskEnum}.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Risk</em>' attribute isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Risk</em>' attribute.
   * @see org.xtext.example.mydsl.myDsl.RiskEnum
   * @see #setRisk(RiskEnum)
   * @see org.xtext.example.mydsl.myDsl.MyDslPackage#getSystemPRODUCESDataSet_Risk()
   * @model
   * @generated
   */
  RiskEnum getRisk();

  /**
   * Sets the value of the '{@link org.xtext.example.mydsl.myDsl.SystemPRODUCESDataSet#getRisk <em>Risk</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Risk</em>' attribute.
   * @see org.xtext.example.mydsl.myDsl.RiskEnum
   * @see #getRisk()
   * @generated
   */
  void setRisk(RiskEnum value);

} // SystemPRODUCESDataSet

Can anyone shed any light on what is going on here?

The attribute LHS is available on the super type of SystemPRODUCESDataSet and friends. Relationship should expose a getter for it. That's because all subtypes of Relationship have LHS in common so its automatically pulled up into the super type.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM