diff --git a/backend/pkg/textdic/parser.go b/backend/pkg/textdic/parser.go index 5d09e05..d600ae7 100644 --- a/backend/pkg/textdic/parser.go +++ b/backend/pkg/textdic/parser.go @@ -9,7 +9,6 @@ import __yyfmt__ "fmt" import ( "fmt" - "sync" ) // Define Node and Nodes types @@ -20,24 +19,13 @@ type Node struct { type Nodes []Node -// Modify yyParserImpl to hold a reference to the current Parser -type yyParserImpl struct { - lval yySymType - stack [yyInitialStackSize]yySymType - char int - parser *Parser // Add parser field -} - -// Modify yyNewParser to accept a Parser instance -func yyNewParser(parser *Parser) yyParser { - return &yyParserImpl{parser: parser} -} - -func yyParse(yylex yyLexer, parser *Parser) int { - return yyNewParser(parser).Parse(yylex) +func ParseAndGetNodes(yylex yyLexer) []Node { + yyparser := &yyParserImpl{} + yyparser.Parse(yylex) + return yyparser.getNodes() } -//line ./pkg/textdic/parser.y:36 +//line ./pkg/textdic/parser.y:24 type yySymType struct { yys int str string @@ -66,35 +54,18 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line ./pkg/textdic/parser.y:65 +//line ./pkg/textdic/parser.y:53 func yyError(s string) { fmt.Println("Error:", s) } -// Parser struct to encapsulate parsedNodes with a mutex for thread safety -type Parser struct { - mu sync.Mutex - parsedNodes Nodes -} - -// NewParser initializes and returns a new Parser instance -func NewParser() *Parser { - return &Parser{} -} - -// getNodes returns the parsed nodes with a mutex lock -func (p *Parser) getNodes() Nodes { - p.mu.Lock() - defer p.mu.Unlock() - return p.parsedNodes +func (yyrcvr *yyParserImpl) setNodes(nodes []Node) { + yyrcvr.lval.nodes = nodes } -// setNodes sets the parsed nodes with a mutex lock -func (p *Parser) setNodes(nodes Nodes) { - p.mu.Lock() - defer p.mu.Unlock() - p.parsedNodes = nodes +func (yyrcvr *yyParserImpl) getNodes() []Node { + return yyrcvr.lval.nodes } //line yacctab:1 @@ -174,10 +145,20 @@ type yyParser interface { Lookahead() int } +type yyParserImpl struct { + lval yySymType + stack [yyInitialStackSize]yySymType + char int +} + func (p *yyParserImpl) Lookahead() int { return p.char } +func yyNewParser() yyParser { + return &yyParserImpl{} +} + const yyFlag = -1000 func yyTokname(c int) string { @@ -297,6 +278,10 @@ out: return char, token } +func yyParse(yylex yyLexer) int { + return yyNewParser().Parse(yylex) +} + func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int { var yyn int var yyVAL yySymType @@ -474,14 +459,14 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] -//line ./pkg/textdic/parser.y:52 +//line ./pkg/textdic/parser.y:40 { yyVAL.nodes = yyDollar[1].nodes - yyrcvr.parser.setNodes(yyDollar[1].nodes) + yyrcvr.setNodes(yyDollar[1].nodes) } case 2: yyDollar = yyS[yypt-2 : yypt+1] -//line ./pkg/textdic/parser.y:56 +//line ./pkg/textdic/parser.y:44 { if yyDollar[2].node.Word != "" { yyVAL.nodes = append(yyDollar[1].nodes, yyDollar[2].node) @@ -491,7 +476,7 @@ yydefault: } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line ./pkg/textdic/parser.y:57 +//line ./pkg/textdic/parser.y:45 { if yyDollar[1].node.Word != "" { yyVAL.nodes = []Node{yyDollar[1].node} @@ -501,13 +486,13 @@ yydefault: } case 4: yyDollar = yyS[yypt-3 : yypt+1] -//line ./pkg/textdic/parser.y:61 +//line ./pkg/textdic/parser.y:49 { yyVAL.node = Node{Word: yyDollar[1].str, Definition: yyDollar[2].str} } case 5: yyDollar = yyS[yypt-1 : yypt+1] -//line ./pkg/textdic/parser.y:62 +//line ./pkg/textdic/parser.y:50 { yyVAL.node = Node{} } diff --git a/backend/pkg/textdic/parser.y b/backend/pkg/textdic/parser.y index d9db8b9..f652b90 100644 --- a/backend/pkg/textdic/parser.y +++ b/backend/pkg/textdic/parser.y @@ -3,7 +3,6 @@ package textdic import ( "fmt" - "sync" ) // Define Node and Nodes types @@ -14,21 +13,10 @@ type Node struct { type Nodes []Node -// Modify yyParserImpl to hold a reference to the current Parser -type yyParserImpl struct { - lval yySymType - stack [yyInitialStackSize]yySymType - char int - parser *Parser // Add parser field -} - -// Modify yyNewParser to accept a Parser instance -func yyNewParser(parser *Parser) yyParser { - return &yyParserImpl{parser: parser} -} - -func yyParse(yylex yyLexer, parser *Parser) int { - return yyNewParser(parser).Parse(yylex) +func ParseAndGetNodes(yylex yyLexer) []Node { + yyparser := &yyParserImpl{} + yyparser.Parse(yylex) + return yyparser.getNodes() } %} @@ -49,7 +37,7 @@ func yyParse(yylex yyLexer, parser *Parser) int { %% start - : entries EOF { $$ = $1; yyrcvr.parser.setNodes($1); } + : entries EOF { $$ = $1; yyrcvr.setNodes($1); } ; entries @@ -68,27 +56,10 @@ func yyError(s string) { fmt.Println("Error:", s) } -// Parser struct to encapsulate parsedNodes with a mutex for thread safety -type Parser struct { - mu sync.Mutex - parsedNodes Nodes +func (yyrcvr *yyParserImpl) setNodes(nodes []Node) { + yyrcvr.lval.nodes = nodes } -// NewParser initializes and returns a new Parser instance -func NewParser() *Parser { - return &Parser{} -} - -// getNodes returns the parsed nodes with a mutex lock -func (p *Parser) getNodes() Nodes { - p.mu.Lock() - defer p.mu.Unlock() - return p.parsedNodes -} - -// setNodes sets the parsed nodes with a mutex lock -func (p *Parser) setNodes(nodes Nodes) { - p.mu.Lock() - defer p.mu.Unlock() - p.parsedNodes = nodes -} +func (yyrcvr *yyParserImpl) getNodes() []Node { + return yyrcvr.lval.nodes +} \ No newline at end of file diff --git a/backend/pkg/textdic/parser_service.go b/backend/pkg/textdic/parser_service.go index aeabc37..65f1c49 100644 --- a/backend/pkg/textdic/parser_service.go +++ b/backend/pkg/textdic/parser_service.go @@ -14,17 +14,13 @@ func NewParserService() *parserService { // ProcessDictionary processes a given dictionary string and returns the parsed Nodes or an error func (ps *parserService) ProcessDictionary(dic string) ([]Node, error) { - // Create a new Parser instance for each request - parser := NewParser() // Use the new parser to parse the input l := newLexer(dic) // Parse the input using the new parser - yyParse(l, parser) + parsedNodes := ParseAndGetNodes(l) - // Retrieve the parsed nodes - parsedNodes := parser.getNodes() if len(parsedNodes) == 0 { return nil, fmt.Errorf("no nodes were parsed") } diff --git a/backend/pkg/textdic/parser_test.go b/backend/pkg/textdic/parser_test.go index 686a557..c29a437 100644 --- a/backend/pkg/textdic/parser_test.go +++ b/backend/pkg/textdic/parser_test.go @@ -51,17 +51,13 @@ There is no leeway to provide services free of charge for the sake of others. } for _, tc := range testCases { - // Create a new parser - parser := NewParser() // Create a new lexer with the input l := newLexer(tc.input) // Parse the input using the parser instance - yyParse(l, parser) + parsedNodes := ParseAndGetNodes(l) - // Compare the result with the expected output - parsedNodes := parser.getNodes() if len(parsedNodes) != len(tc.expected) { t.Errorf("expected %d nodes, but got %d", len(tc.expected), len(parsedNodes)) }