← Home
For problem statement at 0-999/0-99/0-9/7/problemE.txt this is a correct solution, but verifier at 0-999/0-99/0-9/7/verifierE.go ends with All 148 tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Expr struct {
	Type       int // 0: Primary, 1: MultDiv, 2: AddSub
	Suspicious bool
}

func combine(left Expr, right Expr, op byte) Expr {
	suspicious := left.Suspicious || right.Suspicious

	if op == '*' || op == '/' {
		if left.Type == 2 {
			suspicious = true
		}
	}

	if op == '-' {
		if right.Type == 2 {
			suspicious = true
		}
	} else if op == '*' {
		if right.Type == 2 {
			suspicious = true
		}
	} else if op == '/' {
		if right.Type == 1 || right.Type == 2 {
			suspicious = true
		}
	}

	typ := 0
	if op == '+' || op == '-' {
		typ = 2
	} else if op == '*' || op == '/' {
		typ = 1
	}

	return Expr{Type: typ, Suspicious: suspicious}
}

func lex(s string) []string {
	var tokens []string
	for i := 0; i < len(s); i++ {
		if s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n' {
			continue
		}
		if (s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z') {
			j := i
			for j < len(s) && ((s[j] >= 'a' && s[j] <= 'z') || (s[j] >= 'A' && s[j] <= 'Z')) {
				j++
			}
			tokens = append(tokens, s[i:j])
			i = j - 1
		} else if s[i] >= '0' && s[i] <= '9' {
			j := i
			for j < len(s) && s[j] >= '0' && s[j] <= '9' {
				j++
			}
			tokens = append(tokens, s[i:j])
			i = j - 1
		} else if s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '(' || s[i] == ')' || s[i] == '#' {
			tokens = append(tokens, string(s[i]))
		}
	}
	return tokens
}

type Parser struct {
	tokens []string
	pos    int
	macros map[string]Expr
}

func (p *Parser) peek() string {
	if p.pos >= len(p.tokens) {
		return ""
	}
	return p.tokens[p.pos]
}

func (p *Parser) match(s string) bool {
	if p.peek() == s {
		p.pos++
		return true
	}
	return false
}

func (p *Parser) consume() string {
	s := p.peek()
	p.pos++
	return s
}

func (p *Parser) parseExpression() Expr {
	return p.parseAddSub()
}

func (p *Parser) parseAddSub() Expr {
	left := p.parseMultDiv()
	for {
		if p.match("+") {
			right := p.parseMultDiv()
			left = combine(left, right, '+')
		} else if p.match("-") {
			right := p.parseMultDiv()
			left = combine(left, right, '-')
		} else {
			break
		}
	}
	return left
}

func (p *Parser) parseMultDiv() Expr {
	left := p.parsePrimary()
	for {
		if p.match("*") {
			right := p.parsePrimary()
			left = combine(left, right, '*')
		} else if p.match("/") {
			right := p.parsePrimary()
			left = combine(left, right, '/')
		} else {
			break
		}
	}
	return left
}

func (p *Parser) parsePrimary() Expr {
	if p.match("(") {
		inner := p.parseExpression()
		p.match(")")
		return Expr{Type: 0, Suspicious: inner.Suspicious}
	}

	tok := p.consume()
	if isIdent(tok) {
		if val, ok := p.macros[tok]; ok {
			return val
		}
		return Expr{Type: 0, Suspicious: false}
	}
	return Expr{Type: 0, Suspicious: false}
}

func isIdent(s string) bool {
	if len(s) == 0 {
		return false
	}
	return (s[0] >= 'a' && s[0] <= 'z') || (s[0] >= 'A' && s[0] <= 'Z')
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	if !scanner.Scan() {
		return
	}
	firstLine := strings.TrimSpace(scanner.Text())
	n, _ := strconv.Atoi(firstLine)

	macros := make(map[string]Expr)

	for i := 0; i < n; i++ {
		if !scanner.Scan() {
			return
		}
		line := scanner.Text()
		tokens := lex(line)
		idx := 0
		if idx < len(tokens) && tokens[idx] == "#" {
			idx++
		}
		if idx < len(tokens) && tokens[idx] == "define" {
			idx++
		}
		if idx < len(tokens) {
			name := tokens[idx]
			exprTokens := tokens[idx+1:]
			p := &Parser{tokens: exprTokens, macros: macros}
			expr := p.parseExpression()
			macros[name] = expr
		}
	}

	for scanner.Scan() {
		line := scanner.Text()
		line = strings.TrimSpace(line)
		if line == "" {
			continue
		}
		tokens := lex(line)
		if len(tokens) == 0 {
			continue
		}
		p := &Parser{tokens: tokens, macros: macros}
		expr := p.parseExpression()
		if expr.Suspicious {
			fmt.Println("Suspicious")
		} else {
			fmt.Println("OK")
		}
		return
	}
}
```