Я построил грамматику в xText, чтобы распознать формальные выражения определенного формата и использовать сгенерированное дерево объектов в Java.
Это то, что он выглядит следующим образом:xText Назначение переменной/атрибута
grammar eu.gemtec.device.espa.texpr.Texpr with org.eclipse.xtext.common.Terminals
generate texpr "http://www.gemtec.eu/device/espa/texpr/Texpr"
Model:
(expressions+=AbstractExpression)*
;
AbstractExpression:
MatcherExpression | Assignment;
MatcherExpression:
TerminalMatcher ({Operation.left=current} operator='or' right= MatcherExpression)?
;
TerminalMatcher returns MatcherExpression:
'(' MatcherExpression ')' | {MatcherLiteral} value=Literal
;
Literal:
CharMatcher | ExactMatcher
;
CharMatcher:
type=('text'|'number'|'symbol'|'whitespace') ('(' cardinality=Cardinality ')')?
;
/* Kardinalitäten für CharMatcher*/
Cardinality:
CardinalityMin | CardinalityMinMax | CardinalityMax| CardinalityExact
;
CardinalityMin: min=INT '->';
CardinalityMinMax: min=INT '->' max=INT;
CardinalityMax: '->' max=INT;
CardinalityExact: exact=INT;
ExactMatcher:
(ignoreCase='ignoreCase''(' expected=STRING ')') | expected=STRING
;
/* Variablenzuweisung
*
* z.B. $myVar=number
* */
Assignment:
'$' name=ID '=' expression=MatcherExpression
;
Все отлично для «мощности» уступки, за исключением работ.
Выражений выглядят следующим образом:
номер текст (3) - (произвольное количество букв следует ровно 3 цифр)
номер символа (2->) - (произвольное количество специальных символов следует в не более 2-х номеров)
пробел номер (-> 4) - (произвольное количество пробелов, за которым следует максимум 4 номера)
номер (3-> 6) - (не менее 3 цифр, но не более 6)
Когда я запускаю Eclipse с помощью этой грамматики (так, что мой язык распознан и имеет завершение кода и т. Д.), Все, что я набираю, показано в «Контур», -tab как древовидная структура, как следует, за исключением значений мощности.
Когда я добавляю заявление о мощности в CharMatcher, перед ним появляется маленький плюс, но когда я нажимаю на него, он просто исчезает.
Может ли кто-нибудь сказать мне, почему это не работает?
Да, у меня была такая же проблема и применено то же решение. – Aubin