From 68734c1ebe31c6d8be499852a2060af6909ecf03 Mon Sep 17 00:00:00 2001 From: Yasuyuki Takeo Date: Sun, 11 Aug 2024 06:42:12 +0900 Subject: [PATCH] Add GetError in dictionary parser --- backend/pkg/textdic/parser.go | 68 ++++++++++++------- backend/pkg/textdic/parser.y | 42 +++++++++--- backend/pkg/textdic/parser_test.go | 3 +- .../pkg/textdic/text_dictionary_service.go | 3 +- 4 files changed, 79 insertions(+), 37 deletions(-) diff --git a/backend/pkg/textdic/parser.go b/backend/pkg/textdic/parser.go index d600ae7..20b2dbd 100644 --- a/backend/pkg/textdic/parser.go +++ b/backend/pkg/textdic/parser.go @@ -5,13 +5,9 @@ package textdic import __yyfmt__ "fmt" -//line ./pkg/textdic/parser.y:2 - -import ( - "fmt" -) - // Define Node and Nodes types +// +//line ./pkg/textdic/parser.y:2 type Node struct { Word string Definition string @@ -19,18 +15,19 @@ type Node struct { type Nodes []Node -func ParseAndGetNodes(yylex yyLexer) []Node { - yyparser := &yyParserImpl{} - yyparser.Parse(yylex) - return yyparser.getNodes() +type Error struct { + state int + token int + msg string } -//line ./pkg/textdic/parser.y:24 +//line ./pkg/textdic/parser.y:20 type yySymType struct { - yys int - str string - node Node - nodes Nodes + yys int + str string + node Node + nodes Nodes + errors []Error } const WORD = 57346 @@ -54,20 +51,43 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line ./pkg/textdic/parser.y:53 +//line ./pkg/textdic/parser.y:50 -func yyError(s string) { - fmt.Println("Error:", s) +type Parser interface { + Parse(yyLexer) int + GetNodes() []Node + GetErrors() []Error +} + +func NewParser(yylex yyLexer) Parser { + yyparser := &yyParserImpl{} + yyparser.Parse(yylex) + return yyparser } func (yyrcvr *yyParserImpl) setNodes(nodes []Node) { yyrcvr.lval.nodes = nodes } -func (yyrcvr *yyParserImpl) getNodes() []Node { +func (yyrcvr *yyParserImpl) GetNodes() []Node { return yyrcvr.lval.nodes } +func (yyrcvr *yyParserImpl) GetErrors() []Error { + // Slice of Error structs + var errors []Error + + // Loop over yyErrorMessages and add to errors slice + for _, errMsg := range yyErrorMessages { + errors = append(errors, Error{ + state: errMsg.state, + token: errMsg.token, + msg: errMsg.msg, + }) + } + return errors +} + //line yacctab:1 var yyExca = [...]int8{ -1, 1, @@ -459,14 +479,14 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] -//line ./pkg/textdic/parser.y:40 +//line ./pkg/textdic/parser.y:37 { yyVAL.nodes = yyDollar[1].nodes yyrcvr.setNodes(yyDollar[1].nodes) } case 2: yyDollar = yyS[yypt-2 : yypt+1] -//line ./pkg/textdic/parser.y:44 +//line ./pkg/textdic/parser.y:41 { if yyDollar[2].node.Word != "" { yyVAL.nodes = append(yyDollar[1].nodes, yyDollar[2].node) @@ -476,7 +496,7 @@ yydefault: } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line ./pkg/textdic/parser.y:45 +//line ./pkg/textdic/parser.y:42 { if yyDollar[1].node.Word != "" { yyVAL.nodes = []Node{yyDollar[1].node} @@ -486,13 +506,13 @@ yydefault: } case 4: yyDollar = yyS[yypt-3 : yypt+1] -//line ./pkg/textdic/parser.y:49 +//line ./pkg/textdic/parser.y:46 { yyVAL.node = Node{Word: yyDollar[1].str, Definition: yyDollar[2].str} } case 5: yyDollar = yyS[yypt-1 : yypt+1] -//line ./pkg/textdic/parser.y:50 +//line ./pkg/textdic/parser.y:47 { yyVAL.node = Node{} } diff --git a/backend/pkg/textdic/parser.y b/backend/pkg/textdic/parser.y index f652b90..5efd001 100644 --- a/backend/pkg/textdic/parser.y +++ b/backend/pkg/textdic/parser.y @@ -1,10 +1,6 @@ %{ package textdic -import ( - "fmt" -) - // Define Node and Nodes types type Node struct { Word string @@ -13,10 +9,10 @@ type Node struct { type Nodes []Node -func ParseAndGetNodes(yylex yyLexer) []Node { - yyparser := &yyParserImpl{} - yyparser.Parse(yylex) - return yyparser.getNodes() +type Error struct { + state int + token int + msg string } %} @@ -25,6 +21,7 @@ func ParseAndGetNodes(yylex yyLexer) []Node { str string node Node nodes Nodes + errors []Error } %token WORD DEFINITION NEWLINE EOF @@ -52,14 +49,37 @@ entry %% -func yyError(s string) { - fmt.Println("Error:", s) +type Parser interface { + Parse(yyLexer) int + GetNodes() []Node + GetErrors() []Error +} + +func NewParser(yylex yyLexer) Parser { + yyparser := &yyParserImpl{} + yyparser.Parse(yylex) + return yyparser } func (yyrcvr *yyParserImpl) setNodes(nodes []Node) { yyrcvr.lval.nodes = nodes } -func (yyrcvr *yyParserImpl) getNodes() []Node { +func (yyrcvr *yyParserImpl) GetNodes() []Node { return yyrcvr.lval.nodes +} + +func (yyrcvr *yyParserImpl) GetErrors() []Error { + // Slice of Error structs + var errors []Error + + // Loop over yyErrorMessages and add to errors slice + for _, errMsg := range yyErrorMessages { + errors = append(errors, Error{ + state: errMsg.state, + token: errMsg.token, + msg: errMsg.msg, + }) + } + return errors } \ No newline at end of file diff --git a/backend/pkg/textdic/parser_test.go b/backend/pkg/textdic/parser_test.go index 81968b7..601ad03 100644 --- a/backend/pkg/textdic/parser_test.go +++ b/backend/pkg/textdic/parser_test.go @@ -60,7 +60,8 @@ There is no leeway to provide services free of charge for the sake of others. l := newLexer(tc.input) // Parse the input using the parser instance - parsedNodes := ParseAndGetNodes(l) + parser := NewParser(l) + parsedNodes := parser.GetNodes() if len(parsedNodes) != len(tc.expected) { t.Errorf("expected %d nodes, but got %d", len(tc.expected), len(parsedNodes)) diff --git a/backend/pkg/textdic/text_dictionary_service.go b/backend/pkg/textdic/text_dictionary_service.go index c504282..e59d38b 100644 --- a/backend/pkg/textdic/text_dictionary_service.go +++ b/backend/pkg/textdic/text_dictionary_service.go @@ -22,7 +22,8 @@ func (tds *textDictionaryService) Process(ctx context.Context, dic string) ([]No l := newLexer(dic) // Parse the input using the new parser - parsedNodes := ParseAndGetNodes(l) + parser := NewParser(l) + parsedNodes := parser.GetNodes() if len(parsedNodes) == 0 { err := fmt.Errorf("no nodes were parsed")