2013-12-17 4 views
1

Мне нужно правило грамматики XText (или несколько) работает аналогично следующему:XText множественным перекрестные ссылки

1: CollectionGetElement: 
2: val=[VariableReference] '=' 
3: (ref=[List] | ref=[Bytefield] | ref=[Map]) 
4: '[' keys+=GetElementKeyType ']' ('[' keys+=GetElementKeyType ']')* ';'; 

5: GetElementKeyType: 
6: key=[VariableReference] | INT | STRING; 

Как это Unfortuantely он не работает из-за 3 линии!

Я также пробовал 3 отдельных правила (для: map, list и bytefield), но тогда для парсера трудно (невозможно) распознать правильное правило. затем

ListGetElement: 
    val=[VariableReference] '=' 
    ref=[List] 
    '[' key+=GetElementKeyType ']' ('[' key+=GetElementKeyType ']')* ';'; 
... same for the others 

Ошибка:

Decision can match input such as "RULE_ID '=' RULE_ID '[' RULE_ID ']' '[' RULE_ID ']' ';'" using multiple alternatives: 5, 6 
The following alternatives can never be matched: 6 

Какой самый лучший способ для того чтобы достигнуть этого?

ответ

3

есть две проблем в вашей грамматике,

  1. начисление 3 различных типов приписывать «реф»
  2. генерирующих 3 различных типов, анализируя некоторые ID

Я не уверен, что делать Вы хотите сделать. Но я могу привести вам пример. Надеюсь, это может вам помочь.

например.

List: 
    'list' '(' elements += Element * ')'; 
Map: 
    'map' '(' pairs += Pair * ')'; 
GeneralDataType: 
    List | Map 
CollectionGetElement: 
    val=[VariableReference] '=' 
    ref = GeneralDataType 
; 
+0

спасибо, не знаю, почему я этого не видел – user972851

+0

Я тоже, спасибо. –

Смежные вопросы