public static Module ParseModule(SourceUnit sourceUnit, HappyLanguageContext languageContext) { Lexer lexer = new Lexer(sourceUnit, languageContext); Parser parser = new Parser(lexer, languageContext); Module retval = null; try { retval = parser.Parse(); } catch(AbortParseException) { //Left blank intentionally because AbortParseExceptions should never //be allowed to bubble up to the caller. } catch(SyntaxErrorException) { //We actually want to allow this exception to propogate as-is back //to the caller. This is needed because of the catch-all below throw; } catch(Exception e) { //All other exceptions are to be considered an internal error //We may not know the exact location of the error, but we'll just //take the next token out of the lexer to give *some* kind of //idea line might contain the error DebugAssert.IsNotNull(e); Token t = lexer.NextToken(); throw new InternalSourceException(e, t.Location, "The parser threw an unhandled exception. This is usually caused by a syntax error " + "in the script being parsed. The error ocurred at or before the this locaiton."); } return retval; }
protected internal static Token NextTokenAssert(Lexer lexer, HappyTokenKind expectedHappyTokenKind, string expectedText) { Token t = lexer.NextToken(); Assert.AreEqual(expectedHappyTokenKind, t.HappyTokenKind, "Token Text: {0}", t.Text); Assert.AreEqual(expectedText, t.Text); return t; }
protected internal static void NextTokenAssert(Lexer lexer, HappyTokenKind expectedHappyTokenKind) { Token t = lexer.NextToken(); Assert.AreEqual(expectedHappyTokenKind, t.HappyTokenKind, "Token Text: {0}", t.Text); }
internal Parser(Lexer lexer, HappyLanguageContext languageContext) { _lexer = lexer; _errorCollector = new ErrorCollector(languageContext.ErrorSink); }
internal Lexer TestVerbatimLexer(string text) { Lexer retval = new Lexer(LanguageContext.CreateSnippet("<|" + text + "|>", SourceCodeKind.AutoDetect), LanguageContext); NextTokenAssert(retval, HappyTokenKind.BeginTemplate); Assert.AreEqual(Lexer.LexerMode.LexingVerbatimText, retval.Mode); return retval; }