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.

有帮助吗?

解决方案

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.

其他提示

You need to make your syntax recursive. The basic idea is that a CONDITION_LEVEL can be, for example, two CONDITION_LEVEL separated by an OPERATOR.

I don't know the specifics of the xtext syntax, but using a BCNF-like syntax you could have:

CONDITION_LEVEL:
    NUMBER
    '(' CONDITION_LEVEL OPERATOR CONDITION_LEVEL ')'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top