Search code examples
javadslxtext

Own DSL with XText. Problem with unlimited brackets ("(", ")")


I am developing my own DSL in XText.

I want do something like this:

1 AND (2 OR (3 OR 4))

Here my current .xtext file:

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

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

Model:
    (greetings+=CONDITION_LEVEL)
;

terminal NUMBER :
    ('1'..'9') ('0'..'9')*
;

AND:
    ' AND '
;

OR:
    ' OR '
;

OPERATOR : 
    AND | OR
;

CONDITION_LEVEL:
    ('('* NUMBER (=>')')* OPERATOR)+ NUMBER ')'*
;

The problem I am having is that the dsl should have the possibility to make unlimited bracket, but show an error when the programmer don't closes all opened bracket.

example:

1 AND (2 OR (3 OR 4)

one bracket is missing --> should make error.

I don't know how I can realize this in XText. Can anybody help?

thx for helping.


Solution

  • Try this:

    CONDITION_LEVEL
      :  ATOM ((AND | OR) ATOM)*
      ;
    
    ATOM 
      :  NUMBER 
      |  '(' CONDITION_LEVEL ')'
      ;
    

    Note that I have no experience with XText (so I did not test this), but this does work with ANTLR, on which XText is built (or perhaps it only uses ANTLR...).

    Aslo, you probably don't want to surround your operator-tokens with spaces, but put them on a hidden-parser channel:

    grammar org.xtext.example.mydsl.MyDsl hidden(SPACE)
    
    ...
    
    terminal SPACE : (' '|'\t'|'\r'|'\n')+;
    
    ...
    

    Otherwise source like this would fail:

    1 AND(2 OR 3)
    

    For details, see Hidden Terminal Symbols from the XText user guide.