我想知道您如何使用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 Parser
和Parse
即可。
start = comment
comment = COMSTART (not_com/comment)* COMSTOP
not_com = (!COMSTOP !COMSTART.)
COMSTART = '{-'
COMSTOP = '-}'
要回答您的一般问题:最简单的方法是
(!rulename .)
,其中rulename
是语法中定义的另一条规则。 ! rulename
部分仅确保接下来扫描的所有内容与rulename
不匹配,但是您仍然必须为匹配的规则定义一些内容,这就是我包括.
的原因。