2012-02-16 3 views
0

Я пытаюсь создать грамматику, анализирующие бы следующее:XText список элементов или только один элемент

reference: java.util.String 

но а

reference: {java.util.String, java.lang.Integer} 

Другими словами, я хочу его проанализируйте как список Квалифицированных имен, но также только один элемент (в этом случае не помечен '{').

То, что я попытался это:

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values+=QualifiedName); 

Однако я получаю сообщение об ошибке: отсутствующий «{» на «Java», при использовании первой формы ссылки (без {). Любые предложения, что я должен попробовать?

EDIT: Также пробовал

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | ((!'{')values+=QualifiedName); 

, но не получая нет жизнеспособной альтернативы на входе '!' ошибка в определении грамматики.

EDIT2: У меня нет проблем с «списком, разделенным запятыми», я пробовал это отдельно, и он работает хорошо. Моя единственная проблема заключается в различии между двумя частями правила, основанными на символе '{'.

ответ

8

Это будет делать трюк:

Reference: 
'reference' ':' (
    '{' values+=QualifiedName (',' values+=QualifiedName)* '}' 
    | values+=QualifiedName 
); 

Пожалуйста, обратите внимание на precedencies групп и альтернатив.

+0

Отлично, я понял, где я ошибся :) – Deelazee

0

Я совершенно новой для XText, так что просто дать ему попробовать:

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values=QualifiedName); 

или

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)+ '}') | (values=QualifiedName); 
+0

Первый: не может присваивать значение QualifiedName значениям, поскольку он имеет различную мощность для другого случая значений (получение ошибки в грамматике). Второй: мне нужен список неопределенного размера, поэтому + не будет соответствовать (означает 0 или 1). Спасибо за попытку. – Deelazee

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