Пропускайте пробелы и комментарии с помощью FParsec - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь пропустить любые пробелы или комментарии при анализе языка программирования.

Есть два типа комментариев, которые я хочу пропустить:

  1. Комментарий к строке: ;; skip rest of line
  2. Комментарий блока: (; skip anything between ;)

Пример кода для синтаксического анализа с комментариями и пробелами:

(type (; block comment ;) (func))
(import "env" "g" (global $g (mut i32)))
(func (type 0) ;; line comment
     i32.const 100
     global.set $g)
(export "f" (func 0))

Я пробовал несколько подходов, но парсер всегда где-то ломается. Моя идея такая:

let comment : Parser<unit, Ctx> = 
    let lineComment  = skipString ";;" >>. skipRestOfLine true
    let blockComment = between (skipString "(;") (skipString ";)") (skipMany anyChar)
    spaces >>. lineComment <|> blockComment

let wsOrComment = attempt comment <|> spaces

Я бы хотел, чтобы комментарии полностью игнорировались, как и пробелы. Есть идеи, как это сделать sh? (Это мой первый проект с FParse c)

1 Ответ

0 голосов
/ 18 июня 2020

Основываясь на предложении Кенига Лира, я отфильтровал все комментарии с помощью регулярного выражения перед тем, как пропустить текст через синтаксический анализатор. Возможно, это не самый лучший вариант, но он надежно справляется со своей задачей всего с двумя строчками кода.

let removeComments s = 
    let regex = Regex(@"\(;.*;\)|;;.*")
    regex.Replace(s, String.Empty)

let input = """
(type (; block comment ;) (func))
(import "env" "g" (global $g (mut i32)))
(func (type 0) ;; line comment
     i32.const 100
     global.set $g)
(export "f" (func 0))
"""

let filtered = removeComments input

// parse "filtered" with FParsec
...