如何在Happy解析器中匹配正则表达式

How do I match a Regular Expression in a Happy parser?

本文关键字:正则表达式 Happy      更新时间:2023-09-26

我正在用Happy编写一个JavaScript解析器,我需要匹配一个正则表达式。我不想完全解析正则表达式,只需将其存储为字符串即可。

我的AST的相关部分如下:

data PrimaryExpr
    -- | Literal integer
    = ExpLitInt     Integer
    -- | Literal strings
    | ExpLitStr     String
    -- | Identifier
    | ExpId         String
    -- | Bracketed expression
    | ExpBrackExp   Expression
    -- | This (current object)
    | ExpThis
    -- | Regular Expression
    | ExpRegex      String
    -- | Arrays
    | ExpArray      ArrayLit
    -- | Objects
    | ExpObject     [(PropName, Assignment)]
    deriving Show

这是相关的快乐代码:

primaryExpr :: { PrimaryExpr }
    : LITINT          { ExpLitInt $1 }
    | LITSTR          { ExpLitStr $1 }
    | ID              { ExpId $1 }
    | THIS            { ExpThis }
    | regex           { ExpRegex $1 }
    | arrayLit        { ExpArray $1 }
    | objectLit       { ExpObject $1 }
    | '(' expression ')' { ExpBrackExp $2 }

我的问题是,我应该如何定义我的regex非终端?这种结构正确吗?

regex :: { String }
    : '/' whatHere? '/' { $2 }

您应该将regex定义为lexer识别的终端(即LITREGEX)。

primaryExpr :: { PrimaryExpr }
    : LITINT          { ExpLitInt $1 }
    | LITSTR          { ExpLitStr $1 }
    | LITREGEX        { ExpRegex $1 }
    | ID              { ExpId $1 }
    | THIS            { ExpThis }
    | arrayLit        { ExpArray $1 }
    | objectLit       { ExpObject $1 }
    | '(' expression ')' { ExpBrackExp $2 }

要回答评论中的问题,需要多一点空间。

类似(间隔开并评论):

/             forward slash
(  ''.        either: an escaped character
|  [^'[/'']           anything which isn't / or [ or '
|  '[                 a character class containing:
     [^']]*              anything which isn't ] any number of times
   ']                   
)*            any number of times
/             forward slash

浓缩:

/(''.|[^'[/'']|'[[^']]*'])*/