Я пишу парсер JavaScript с Happy, и мне нужно соответствовать регулярному выражению. Я не хочу полностью анализировать регулярное выражение, просто сохраните его как строку.Как сопоставить регулярное выражение в парсе Happy?
Соответствующая часть моего 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 }
Хорошо, хорошая идея. Это приводит к следующему вопросу - как мне получить Alex lexer для соответствия регулярному выражению? (Я мог бы задать это как отдельный вопрос, если вы думаете, что это лучшая идея?) –
Я не эксперт Алекс, но что-то вроде '\/[^ \ /] * \/{\ s -> LITREGEX. в этом . tail $ s} '. Это не позволяет использовать escape/'' s в регулярном выражении. YMMV – pat
Чтобы сделать это правильно, вам нужно иметь дело с обратными косой чертой '/' и с внутренними символьными классами '/'. – pat