【问题标题】:Scala pattern matching multiple combinator parsers resultsScala模式匹配多个组合器解析器结果
【发布时间】:2014-10-24 16:57:13
【问题描述】:

有一个 List[String] 和几个解析器,我想将 List 中的每个 String 模式匹配到解析器。所以它看起来像这样(警告,伪代码):

myStringList.map{
  case MyParser.keyword => keyword match {
    case KeywordParser.keyword1 => //it's special keyword1
    case KeywordParser.keyword2 => //special treatment for keyword2
    case NotSpecial => //it's a usual command
  }
  case MyParser.stringValue => //etc...
}

我为什么要这样做?

我正在解析一个简单的脚本行,其中包含“字符串”和 $(keywords)。有些关键字比较特殊,需要单独处理。 目前我只有一个特殊关键字,所以我使用链式 parseAll 和 match,但感觉不对。

那么,如何实现呢?

【问题讨论】:

    标签: scala parsing functional-programming pattern-matching


    【解决方案1】:

    它不是真的受支持,但你可以这样做:

      val parseKeyword: PartialFunction[String, ... ] {
        case KeywordParser.keyword1 => //it's special keyword1
        case KeywordParser.keyword2 => //special treatment for keyword2
        case NotSpecial => //it's a usual command    
      }
    
      myStringList.map{
        case x@MyParser.keyword if parseKeyword.isDefinedAt(x) => parseKeyword(x)
        case MyParser.stringValue => //etc...
      } 
    

    【讨论】:

      【解决方案2】:

      我打赌我的大脑短路了,因为我第二天早上醒来并意识到,我所需要的只是几个解析器、一些案例类和一对模式匹配器。所以我的问题的解决方案是这样的(伪代码):

      case class SpecialKeyword1(value: String)
      case class SpecialKeyword2(value: String)
      ...
      case class SpecialKeywordN(value: String)
      case class SimpleKeyword(value: String)
      
      object MyParser extends JavaTokenParsers{
        def expression: Parser[Any] = ...
        def keyword1: Parser[SpecialKeyword1] = ...
        def keyword2: ...
        ...
        def simplekeyword: Parser[SimpleKeyword] = ...
      }
      
      object Main {
        def parseScript(inputScript: String): String = {
          MyParser.parseAll(MyParser.expression, inputScript) match {
            case Success(result, _) => {
              case SpecialKeyword1(val) => ...
              case SpecialKeyword2(val) => ...
              ...
              case SimpleKeyword(val) => ...
              case str: String => ...
            }
            case Failure(_, _) => "Parsing Failure"
            case Error(_, _) => "Parsing Error"
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        相关资源
        最近更新 更多