【问题标题】:Parsec and user defined state秒差距和用户定义的状态
【发布时间】:2012-12-20 12:25:47
【问题描述】:

我正在尝试在 haskell 中实现 js 解析器。但我坚持使用自动分号插入。我创建了test project 来解决问题,但我不知道如何解决问题。

在我的测试项目程序中是一个表达式列表(一元或二元):

data Program = Program [Expression]

data Expression
    = UnaryExpression Number
    | PlusExpression Number Number

输入流是一个标记列表:

data Token
    = SemicolonToken
    | NumberToken Number
    | PlusToken

我想解析如下输入:
1; - 一元表达式
1 + 2; - 二进制表达式
1; 2 + 3; - 两个表达式(一元和二进制)
1 2 + 3; -与之前的输入相同,但缺少第一个分号。因此解析器使用标记 1,但任何语法生成都不允许标记 2(下一个预期标记是分号或加号)。自动分号插入规则表示,在这种情况下,分号会自动插入到标记 2 之前。

那么,实现这种解析器行为的最优雅的方式是什么。

【问题讨论】:

    标签: parsing haskell parsec


    【解决方案1】:

    你有

    expression = try unaryExpression <|> plusExpression
    

    但这不起作用,因为UnaryExpressionPlusExpression 的前缀。所以对于

    input2 = [NumberToken Number1, PlusToken, NumberToken Number1, SemicolonToken]
    

    解析器愉快地解析第一个NumberToken 并自动添加分号,因为下一个标记是PlusToken 而不是SemicolonToken。然后它会尝试解析下一个Expression,但是下一个是PlusToken,没有Expression可以从那个开始。

    更改解析器的尝试顺序,

    expression = try plusExpression <|> unaryExpression
    

    它会首先尝试解析PlusExpression,并且只有在失败时才使用UnaryExpression的较短解析。

    【讨论】:

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