反讽语言工具包 - FreeTextLiteral用法

时间:2011-11-01 19:31:23

标签: c# irony

我们对文本模板有一些特殊要求,无法通过任何常见软件包(T4,NVelocity,StringTemplate ..)解决。所以我们决定尝试使用Irony。

给出简单的形式,其中任何内容< %%> tags是一个表达式,否则只是一个文本文字:

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消耗所有输入?

谢谢!

0 个答案:

没有答案