Нижеследующий код у меня вызвал OutOfMemoryException
[PegGrammar(Options = EmitDebugSources,start,
grammar
{
Letter = ([Lu, Ll, Lt, Lm, Lo, Nl] / '_' / '$');
Digit = ['0'..'9'];
IdentStart = Letter;
IdentBody = Letter / Digit;
Ident = IdentStart IdentBody*;
JustText:ParamStringPart = (!':'[Any])*;
Param:ParamStringPart = (':' Ident ':');
//StartPart:StringThenParam = JustText? Param;
start:list[ParamStringPart] = (Param / JustText)*;
}
)]
public class ParamStringParser
{
JustText(t:NToken):ParamStringPart
{
ParamStringPart.JustText(GetText(t))
}
Param(_:NToken,t:NToken,_:NToken):ParamStringPart
{
def text = GetText(t);
ParamStringPart.Param(text,":" + text + ":");
}
start(lst:List[ParamStringPart]):list[ParamStringPart]
{
lst.NToList()
}
}
public variant ParamStringPart
{
|JustText{text:string}
|Param{value:string; raw:string}
}
def text = "select * from Employee e where e.FirstName = :fn: && e.LastName = :ln: order by Id";
def parser = Nelution.Parsers.ParamStringParser();
def pres = parser.Parse(text);
Что я сделал неправильно?
Здравствуйте, Аноним, Вы писали:
А>Что я сделал неправильно?
Правила должны хоть что-то съедать из потока:
JustText:ParamStringPart = (!':'[Any])+;
H>Правила должны хоть что-то съедать из потока:
H>H>JustText:ParamStringPart = (!':'[Any])+;
H>
Да, так все работает. Спасибо за подсказку.