public override bool CreateNonTerminal(Lexer lex, ProductionStorage ps) { string by; // get the leading ( BY | A BU ) if (ps.MatchProduction(Selmaho.BY, out by)) { if (by.Length == 2) by = by[0].ToString(); _String += by; } else if (lex.Peek.Type == Selmaho.BU) { string l = lex.Advance(); if (l.Length > 1) l = "(" + l + ")"; _String += l; lex.Advance();//eat the bu } else { return false; } while(true) { if (ps.MatchProduction(Selmaho.BY, out by)) { if (by.Length == 2) by = by[0].ToString(); _String += by; } else if (lex.Peek.Type == Selmaho.BU) { string l = lex.Advance(); if (l.Length > 1) l = "(" + l + ")"; _String += l; lex.Advance();//eat the bu } else break; } //eat the BOI that might be there ps.MatchProduction(Selmaho.BOI); return true; }
public void AdvanceCarriageReturnIncrementsLine() { using var lexer = new Lexer(new StringReader("\r")); lexer.Advance(); Assert.Equal(2, lexer.Line); }
public void AdvanceAssignsNextValueToCurrent() { using var lexer = new Lexer(new StringReader("123")); lexer.Advance(); Assert.Equal('2', lexer.Current); }
public void AdvanceNewlineIncrementsLine() { using var lexer = new Lexer(new StringReader("\n")); lexer.Advance(); Assert.Equal(2, lexer.Line); }
public void AdvanceReturnsPreviousValue() { using var lexer = new Lexer(new StringReader("123")); var result = lexer.Advance(); Assert.Equal('1', result); }
public void HexNumbers() { var lex = new Lexer("hex.c", "0x201"); lex.Advance(); Assert.AreEqual(TokenKind.CONSTANT, lex.CurrentToken.Kind); Assert.AreEqual(513, lex.CurrentToken.Value); }
void AssertId(string expectedId, string code = null) { var lex = new Lexer("assertid.c", code ?? expectedId); lex.Advance(); Assert.AreEqual(TokenKind.IDENTIFIER, lex.CurrentToken.Kind); Assert.AreEqual(expectedId, lex.CurrentToken.Value); }
public void HexLetters() { var lex = new Lexer("hex.c", "0xC0"); lex.Advance(); Assert.AreEqual(TokenKind.CONSTANT, lex.CurrentToken.Kind); Assert.AreEqual(192, lex.CurrentToken.Value); }
public override bool CreateNonTerminal(Lexer lex, ProductionStorage ts) { if (lex.Current.Type == Selmaho.Operator) { _Operator = lex.Advance(); return true; } return false; }
public Token Parse(ref Lexer lexer) { bool esc = false; bool ok = lexer.Advance(Start); if (!ok) { return(lexer.Capture(false)); } do { if (!esc && lexer.Current == End) { break; } esc = (lexer.Current == Escape); ok = lexer.AdvanceWhile(); }while (ok); ok = lexer.Advance(End); return(lexer.Capture(ok)); }
public Token Parse(ref Lexer lexer) { var ok = lexer.Advance(literal, ignoreCase); return(lexer.Capture(ok)); }