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

Баги парсера, выявленные тестами #33

Closed
impworks opened this issue Nov 3, 2012 · 16 comments
Closed

Баги парсера, выявленные тестами #33

impworks opened this issue Nov 3, 2012 · 16 comments
Assignees
Labels
Milestone

Comments

@impworks
Copy link
Owner

impworks commented Nov 3, 2012

Здесь буду отписываться по мере появления багов в парсере, ради которых не хочется создавать отдельные тикеты.

  1. На парсятся дробные числа. Тест NewObjectDeclaration проходится, если 13.37 заменить на 13.
@ghost ghost assigned ForNeVeR Nov 3, 2012
@ForNeVeR
Copy link
Collaborator

ForNeVeR commented Nov 4, 2012

Внезапно, в грамматике тоже только int. Я пофикшу в парсере, а ты посмотри грамматику - всё ли там ок?

@ForNeVeR
Copy link
Collaborator

ForNeVeR commented Nov 4, 2012

Исправлено. Тикет не закрываю - вдруг ещё что-то найдём.

@ForNeVeR ForNeVeR closed this as completed Jan 5, 2013
@impworks
Copy link
Owner Author

Не парсится такая, вполне вроде бы легальная строка:

1.GetHashCode ()

А вот такая - вполне:

(1).GetHashCode ()

Посмотри пожалуйста, почему так происходит. Может быть, бага в грамматике?
P. S. Строчка ниже не только парсится, но уже работает :)

@impworks impworks reopened this Feb 14, 2013
@ForNeVeR
Copy link
Collaborator

lvalue = [ type "::" ] identifier { accessor_expr } | "(" expr ")" accessor_expr { accessor_expr }

Как видишь, для применения accessor_expr нужно брать expr в скобки. Я бы не стал сейчас это менять - кажется, без этого у нас могут возникнуть какие-нибудь проблемы.

Точно. Убрал в парсере скобки и получил StackOverflowException на этапе парсинга.

@impworks, считаю такое изменение лишним, раз уж оно валит парсер. Для lens 2.0 мы, может, запилим самодельный парсер или что-нибудь в этом роде, а пока что не вижу смысла вносить такие ломающие изменения.

@impworks
Copy link
Owner Author

Попробуй такие изменения в грамматике:

lvalue              = [ type "::" ] identifier { accessor_expr } | atomar_expr accessor_expr { accessor_expr }
value_expr          = atomar_expr | lvalue
atomar_expr         = literal | type_operator_expr | "(" expr ")"

@ForNeVeR
Copy link
Collaborator

Охххх, запилил-таки эти изменения. Было страшно, но я выдержал! Написан тест, грамматика изменена в соответствии с твоим предложением. Единственное - пришлось поменять порядок узлов в value_expr (из-за чего и были проблемы).

@impworks
Copy link
Owner Author

Сначала lvalue? А почему так стало лучше?

@ForNeVeR
Copy link
Collaborator

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

@impworks
Copy link
Owner Author

Нашел еще один баг. В тестах BareLambda и ParametricLambda создается FunctionNode - видимо, я забыл это поменять, когда проводил рефакторинг. Должна создаваться LambdaNode.

@impworks impworks reopened this Feb 24, 2013
@impworks
Copy link
Owner Author

Не парсится следующий, на мой взгляд, корректный код:

fun test -> 10
test ()

Почему?

@ForNeVeR
Copy link
Collaborator

ForNeVeR commented Mar 3, 2013

В тестах BareLambda и ParametricLambda создается FunctionNode

Исправлено: 855be00. Оказалось, что лямбды есть ещё в паре тестов - там тоже поправил.

@ForNeVeR
Copy link
Collaborator

ForNeVeR commented Mar 3, 2013

Не парсится следующий, на мой взгляд, корректный код

Была проблема в грамматике - после funcdef не ожидался перевод строки. Было:

funcdef             = "fun" identifier func_params "->" block

Стало:

funcdef             = "fun" identifier func_params "->" block NL

Добавил тест, починил грамматику и парсер. 9c415f3.

@ForNeVeR ForNeVeR closed this as completed Mar 3, 2013
@impworks
Copy link
Owner Author

impworks commented Mar 3, 2013

Не было бы правильнее требовать от самого block, чтобы он заканчивался
переносом строки или EOF? Чтобы еще где-нибудь не забыть.

@ForNeVeR
Copy link
Collaborator

ForNeVeR commented Mar 3, 2013

Дело в том, что там не только block, но и local_expr, от которого
требовать новой строки нелогично. Сначала я так и попробовал, но отвалился
код с однострочным if-then-else.

@impworks
Copy link
Owner Author

Почему-то не парсятся операторы <= и >=.
См. тест OverloadedOperators.

@ForNeVeR
Copy link
Collaborator

Была проблема в грамматике и парсере, пофикшено: 96528e0.

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