我目前正在为 ECMAScript 5 编写解析器(作为玩具)。该标准规定了如何解析逻辑或表达式:
<LogicalORExpression> :
<LogicalANDExpression>
<LogicalORExpression> || <LogicalANDExpression>
基本上这相当于
<logicalOrExpression> = [<logicalOrExpression> ||] <LogicalAndExpression>
但是我应该如何在不陷入无限循环的情况下解析它?我当前的解析器显然可以:
logicalOrExpression :: Parser LogicalOrExpression
logicalOrExpression = do
orExpr <- optional $ do
e <- logicalOrExpression
_ <- symbol "||"
return e
andExpr <- logicalAndExpression
case orExpr of
Just e -> return $ LogicalOrExpression (e, andExpr)
Nothing -> return $ AndExpression andExpr
谢谢