Синтаксический анализ аргументов метода с помощью FParsec - PullRequest
4 голосов
/ 26 августа 2011

Я пытаюсь реализовать синтаксический анализатор аргументов метода с помощью FParsec.

Мне было интересно, есть ли какая-то уже реализованная функция в самом FParsec, которая помогла бы мне в этой цели?Я спрашиваю об этом, поскольку FParsec предоставляет инструментарий при работе с приоритетами операторов, так что может быть что-то и для этого тоже.


Анализ открывающей и закрывающей скобок довольно прост.Головная боль заключается в рассмотрении следующих трех случаев:

Аргументы метода могут состоять из:

  • без аргументов,
  • один аргумент,
  • несколько аргументов (все разделены запятыми).помните, что последнему аргументу не может предшествовать запятая!

У меня уже есть некоторые подсказки о том, как реализовать это самостоятельно, если нет встроенной функции, а именно:оператор <|> и потоковое копирование, но я бы хотел по возможности держаться подальше от такого рода низкоуровневых вещей.

1 Ответ

4 голосов
/ 26 августа 2011

Я считаю, что вы хотите использовать sepBy.

type AST =
| Arguments of AST list
| Argument of string * string

let parseArguments =
    spaces 
    >>. pchar '(' 
    >>. spaces 
    >>. sepBy parseArgument (pchar ',') 
    .>> spaces 
    .>> pchar ')' 
    |>> Arguments

Под редакцией devoured_elysium:

Приведенный выше код верен, хотя он не компилируется. Я опубликую здесь свою версию для компиляции, так что если кто-то захочет попробовать код без дальнейших церемоний, он сможет это сделать.

type AST =
| Arguments of AST list
| Argument of string

let parseArguments =
    spaces 
    >>. pchar '(' 
    >>. spaces 
    >>. sepBy (many1Satisfy isLetter |>> Argument) (pchar ',')
    .>> spaces 
    .>> pchar ')'
    |>> Arguments

test parseArguments "(a,b,c)" //succeed
test parseArguments "(a,b,c,)" //fail
...