Irony Language Toolkit - использование FreeTextLiteral

У нас есть некоторые особые требования к текстовым шаблонам, которые не могут быть решены ни одним из распространенных пакетов (T4, NVelocity, StringTemplate..). Поэтому мы решили попробовать свои силы, используя Иронию.

Учитывая простую форму, где что-либо внутри тегов <%%> является выражением, в противном случае это просто текстовый литерал:

Hi <% u.FirstName %> This is some template text.

Я начал с этого:

// Terminals
var text = new FreeTextLiteral("FreeTextLiteral", FreeTextOptions.AllowEof | FreeTextOptions.ConsumeTerminator, "<");
text.Escapes.Add(@"\<", "<");

var identifierTerminal = new IdentifierTerminal("identifierTerminal");
var expressionStart = new KeyTerm("%", "ExpressionStart");
var expressionEnd = new KeyTerm("%>", "ExpressionEnd");

// Non terminals
var statement = new NonTerminal("Statement");
var template = new NonTerminal("Template", typeof(StatementListNode));
var expression = new NonTerminal("Expression", typeof(ExpressionListNode));
var memberExpression = new NonTerminal("MemberExpression");

// Rules              
statement.Rule = text | expression;
expression.Rule = expressionStart + memberExpression + expressionEnd;
memberExpression.Rule = identifierTerminal + "." + identifierTerminal;
template.Rule = MakePlusRule(template, null, statement);

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

Как я могу предотвратить использование Freetextliteral всех входных данных?

Спасибо!

0 ответов

Другие вопросы по тегам