From cb6eb301825c5578f40ad0de991deca35e62c441 Mon Sep 17 00:00:00 2001 From: Julius Volz Date: Sat, 12 Jan 2013 02:35:40 +0100 Subject: [PATCH] Fix state cleanup bug between rule/config parser runs. This fixes a bug that has been annoying me minorly for some time now: sometimes, after parse errors, a subsequent parser run would fail. The reason is that yylex() modifies some global variables (yytext, yydata) during its run to keep state. To make subsequent parser runs correct, these have to be reset before each run. Also, close files after reading them. --- config/load.go | 3 +++ rules/load.go | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/config/load.go b/config/load.go index 76de69a47..f9be03f49 100644 --- a/config/load.go +++ b/config/load.go @@ -35,6 +35,8 @@ func LoadFromReader(configReader io.Reader) (*Config, error) { yyin = configReader yypos = 1 yyline = 1 + yydata = "" + yytext = "" lexer := &ConfigLexer{} yyParse(lexer) @@ -54,6 +56,7 @@ func LoadFromString(configString string) (*Config, error) { func LoadFromFile(fileName string) (*Config, error) { configReader, err := os.Open(fileName) + defer configReader.Close() if err != nil { return &Config{}, err } diff --git a/rules/load.go b/rules/load.go index eed2822c2..7c7fe33eb 100644 --- a/rules/load.go +++ b/rules/load.go @@ -48,9 +48,10 @@ func LoadFromReader(rulesReader io.Reader, singleExpr bool) (interface{}, error) yyin = rulesReader yypos = 1 yyline = 1 + yydata = "" + yytext = "" lexer := &RulesLexer{ - parsedRules: []*Rule{}, startToken: START_RULES, } @@ -91,6 +92,7 @@ func LoadRulesFromString(rulesString string) ([]*Rule, error) { func LoadRulesFromFile(fileName string) ([]*Rule, error) { rulesReader, err := os.Open(fileName) + defer rulesReader.Close() if err != nil { return []*Rule{}, err } @@ -112,6 +114,7 @@ func LoadExprFromString(exprString string) (ast.Node, error) { func LoadExprFromFile(fileName string) (ast.Node, error) { exprReader, err := os.Open(fileName) + defer exprReader.Close() if err != nil { return nil, err }