Я делаю парсер для DSL в Haskell с помощью Alex + Happy. Мой DSL использует броски кубиков как часть возможных выражений.
Иногда у меня есть выражение, которое я хочу проанализировать, которое выглядит так:
[some code...] 3D6 [... rest of the code]
Что должно переводить примерно так:
TokenInt {... value = 3}, TokenD, TokenInt {... value = 6}
Мой DSL также использует переменные (в основном, строки), поэтому у меня есть специальный токен, который обрабатывает имена переменных. Итак, с этими токенами:
"D" { \pos str -> TokenD pos }
$alpha [$alpha $digit \_ \']* { \pos str -> TokenName pos str}
$digit+ { \pos str -> TokenInt pos (read str) }
Результат, который я получаю при использовании моего синтаксического анализа сейчас:
TokenInt {... value = 3}, TokenName { ... , name = "D6"}
Это означает, что мой лексер «читает» целое число. и Переменная с именем «D6».
Я пробовал много вещей, например, я изменил токен D на:
$digit "D" $digit { \pos str -> TokenD pos }
Но это просто потребляет цифры: (
- Могу ли я проанализировать бросок кубиков с числами?
- Или хотя бы разобрать TokenInt-TokenD-TokenInt?
PS: Я использую PosN в качестве оболочки, не уверен, что это применимо.