1

一般的なパッケージ (T4、NVelocity、StringTemplate など) では解決できないテキスト テンプレートに関する特別な要件がいくつかあります。そのため、Irony を使用して独自の試みを行うことにしました。

<%%> タグ内のすべてが式であり、それ以外の場合は単なるテキスト リテラルである単純な形式を考えると、次のようになります。

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);

問題は、上記の抽出を解析した後にルート ノードを確認すると、2 つの子ノードがあり、どちらもfreetextliteralノードであるということです。

Freetextliteral がすべての入力を消費しないようにするにはどうすればよいですか?

ありがとう!

4

0 に答える 0