我想知道您如何使用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表达式,但是使用s表达式,很容易:
sExpression = "(" [^)]* ")"

因为亲密的伙伴只是一个字符,我不能用胡萝卜来“替代”它。顺便说一句,我想知道如何不能“长于” pegjs中比单个字符长的内容。

谢谢你的帮助。

最佳答案

这不能解决您的转义机制,但可以使您入门(这里是一个实时查看它的链接:pegedit;只需单击屏幕顶部的Build ParserParse即可。

start = comment

comment = COMSTART (not_com/comment)* COMSTOP

not_com = (!COMSTOP !COMSTART.)

COMSTART = '{-'

COMSTOP = '-}'
要回答您的一般问题:


最简单的方法是(!rulename .),其中rulename是语法中定义的另一条规则。 ! rulename部分仅确保接下来扫描的所有内容与rulename不匹配,但是您仍然必须为匹配的规则定义一些内容,这就是我包括.的原因。

08-05 17:11