Irony Language Toolkit - использование FreeTextLiteral - PullRequest
1 голос
/ 01 ноября 2011

У нас есть некоторые особые требования к текстовым шаблонам, которые не могут быть решены ни одним из распространенных пакетов (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 узлами.

Как запретить Freetextliteral потреблять весь ввод?

Спасибо!

...