code: def test_soft_keyword(self) -> None:
      grammar = """
          start:
              | "number" n=NUMBER { eval(n.string) }
              | "string" n=STRING { n.string }
              | SOFT_KEYWORD l=NAME n=(NUMBER | NAME | STRING) { l.string + " = " + n.string }
          """
      parser_class = make_parser(grammar)
      self.assertEqual(parse_string("number 1", parser_class), 1)
      self.assertEqual(parse_string("string 'b'", parser_class), "'b'")
      self.assertEqual(
          parse_string("number test 1", parser_class), "test = 1"
      )
      assert (
          parse_string("string test 'b'", parser_class) == "test = 'b'"
      )
      with self.assertRaises(SyntaxError):
          parse_string("test 1", parser_class)
  
imports: import ast
  import difflib
  import io
  import textwrap
  import unittest
  from test import test_tools
  from typing import Dict, Any
  from tokenize import TokenInfo, NAME, NEWLINE, NUMBER, OP
label_desc: Use image node_id 33 for calling the TestPegen obj's underlying member method code with example usage: obj.test_soft_keyword() without return types