Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

invoke_list #20

Closed
ForNeVeR opened this issue Oct 29, 2012 · 7 comments
Closed

invoke_list #20

ForNeVeR opened this issue Oct 29, 2012 · 7 comments
Assignees
Labels
Milestone

Comments

@ForNeVeR
Copy link
Collaborator

Нашёл в Grammar.txt потенциально опасную конструкцию:

invoke_list         = { value_expr } | ( { NL "<|" value_expr } NL )

Она опасна тем, что под форму { value_expr } подходит пустая строка - следовательно, эта форма будет матчиться вечно (на самом деле, fparsec просто бросит исключение, обнаружив такой парсер). Необходимо чем-то укрепить эту ветвь, чтобы она не могла сматчиться на пустом месте.

@ghost ghost assigned impworks Oct 29, 2012
@ForNeVeR
Copy link
Collaborator Author

Аналогичная проблема есть в определении type:

type                = [ namespace "." ] identifier [ ( { "[]" } | type_params ) ]

(на месте { "[]" } парсер просто завязнет, если до него доберётся).

@impworks
Copy link
Owner

Не понимаю сути проблемы. Один литерал в фигурных скобках - самый лучший пример конструкции "0 или больше". В регулярках конструкция x* не вызывает никаких проблем, почему тут они возникают? И вообще, как тогда использовать { ... } ?

@ForNeVeR
Copy link
Collaborator Author

А вообще, я рано поднял тревогу, наверное. Нужно потестировать те определения, которые есть - авось прокатит.

(Ранее у меня упал fparsec на конструкции many <| pchar ' ', что и вызвало у меня острое желание обезопасить тылы.)

@ghost ghost assigned ForNeVeR Oct 29, 2012
@ForNeVeR
Copy link
Collaborator Author

type                = [ namespace "." ] identifier [ ( { "[]" } | type_params ) ]

С этим уже вышла проблема вот на этом месте:

Tuple<Suit, int>

Парсер работал так:

  1. Нашёл "Tuple" : identifier.
  2. Попробовал заматчить кусочек из квадратных скобок:
  3. - увидел { "[]" }, успешно заматчил с пустой строкой;
  4. - пошёл дальше, упал и умер.

Я решил эту проблему, переставив узлы в грамматике примерно вот так:

type                = [ namespace "." ] identifier [ ( type_params | { "[]" } ) ]

@impworks
Copy link
Owner

Первая мысль была как раз переставить их местами. Неужели сработало?

@ForNeVeR
Copy link
Collaborator Author

В связи с этим, кстати, нужно поменять эти токены местами в грамматике тоже. @impworks, займись, пожалуйста.

@ForNeVeR
Copy link
Collaborator Author

ForNeVeR commented Nov 1, 2012

Поменяли грамматику, проблема условно решена.

@ForNeVeR ForNeVeR closed this as completed Nov 1, 2012
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants