4

我想知道您如何在 pegjs 中解析评论(例如,la Haskell)。

目标:

{-
    This is a comment and should parse.
    Comments start with {- and end with -}.
    If you've noticed, I still included {- and -} in the comment.
    This means that comments should also nest
    {- even {- to -} arbitrary -} levels
    But they should be balanced
-}

例如,以下内容不应解析:

{- I am an unbalanced -} comment -}

但是你也应该有一个逃生机制:

{- I can escape comment \{- characters like this \-} -}

这种排序看起来像是解析 s-expressions,但使用 s-expressions 很容易:

sExpression = "(" [^)]* ")"

因为关闭括号只是一个字符,我不能用胡萝卜“不”它。顺便说一句,我想知道如何“不”比 pegjs 中的单个字符长的东西。

谢谢你的帮助。

4

1 回答 1

6

这不会处理您的转义机制,但它应该让您开始(这里有一个实时查看它的链接:pegedit;只需单击屏幕顶部的 和Build ParserParse

start = comment

comment = COMSTART (not_com/comment)* COMSTOP

not_com = (!COMSTOP !COMSTART.)

COMSTART = '{-'

COMSTOP = '-}'

要回答您的一般问题:

顺便说一句,我想知道如何“不”比 pegjs 中的单个字符长的东西。

简单的方法是语法中定义的另一个规则在(!rulename .)哪里。rulename! rulename部分只是确保接下来扫描的内容不匹配rulename,但您仍然必须定义一些内容以使规则匹配,这就是我包含..

于 2015-02-12T22:19:02.810 回答