本文整理汇总了C#中Lexer.GetEnumerator方法的典型用法代码示例。如果您正苦于以下问题:C# Lexer.GetEnumerator方法的具体用法?C# Lexer.GetEnumerator怎么用?C# Lexer.GetEnumerator使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Lexer
的用法示例。
在下文中一共展示了Lexer.GetEnumerator方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Parse
protected override ParseTreeNode Parse(Lexer lexer, NonTerminal root)
{
IEnumerator<Token> tokens = lexer.GetEnumerator();
var eof = !tokens.MoveNext();
if (eof)
{
if (root.Rules.Any(a => a.IsNullable()))
return new ParseTreeNode(null, new Token(new Terminal(""), "", 0, 0));
else
throw new ParseException("Empty string not matched by grammar");
}
return Parse(tokens, root, null);
}
示例2: Parse
protected override ParseTreeNode Parse(Lexer lexer, NonTerminal root)
{
IEnumerator<Token> tokens = lexer.GetEnumerator();
var eof = !tokens.MoveNext();
if (eof)
{
if (root.Rules.Any(r => r.IsNullable()))
return new ParseTreeNode(null, new Token(new Terminal(""), "", 0, 0));
else
throw new ParseException("Empty string not matched by grammar");
}
Stack<ParseState> states = new Stack<ParseState>();
states.Push(MakeStateState(root, Grammar));
ParserAction action = ParserAction.Start;
Stack<ParseTreeNode> nodes = new Stack<ParseTreeNode>();
do
{
Production reduceProduction;
ParseState shiftState;
action = Action(states.Peek(), eof ? null : tokens.Current, out reduceProduction, out shiftState);
switch (action)
{
case ParserAction.Accept:
break;
case ParserAction.Error:
throw new ParseException(tokens.Current.ToString());
case ParserAction.Start:
default:
throw new NotImplementedException();
case ParserAction.Shift:
var newLeafNode = new ParseTreeNode(tokens.Current);
nodes.Push(newLeafNode);
states.Push(shiftState);
eof = !tokens.MoveNext();
break;
case ParserAction.Reduce:
var newNode = new ParseTreeNode(reduceProduction.Head);
var children = nodes.Take(reduceProduction.Body.Length).Reverse().Select((n, i) => new KeyValuePair<int, ParseTreeNode>(i, n));
foreach (var child in children)
{
child.Value.Parent = newNode;
nodes.Pop();
var bnfTerm = reduceProduction.Body[child.Key];
var terminal = bnfTerm as Terminal;
string match;
if (terminal != null)
{
if (!terminal.Match(child.Value.Token.Value, 0, out match))
throw new ParseException("Unexpected crap");
}
else if (!reduceProduction.Body[child.Key].Equals(child.Value.NonTerminal))
throw new ParseException("Unexpected crap");
}
nodes.Push(newNode);
for (int i = 0; i < reduceProduction.Body.Length; i++)
states.Pop();
states.Push(Goto(states.Peek(), reduceProduction.Head));
break;
}
} while (action != ParserAction.Accept);
if (nodes.Count != 1)
throw new ParseException("o_0");
return nodes.Pop();
}