2013-05-17 5 views
0

Я установил систему гибких/бизон, которая может запускаться и анализировать через yyparse и может использоваться внутри системы repl-type. Когда пользователь входит в определенное состояние (скажем: определение метода), и была выполнена ошибка systax, я ищу способ справиться с этим таким образом, что зубр может действовать так, как пользователь никогда не входил в линии вообще.Сохранение и восстановление состояния анализатора вручную

Например:

1> class foo { <enter> 
2> a = 1; <enter> 
3> asfasdfa <enter> 

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

Я знаю, что зубры yyparse() функция имеет несколько локальных значений стека состояний (yyvsp, yyssp и yylsp), который используется для отслеживания состояния, но не кажется, нет способа изменить это за пределами стандартной функциональности, как YYERROR и т.д.

Мой вопрос: возможно ли это сделать в удаленном режиме для этих состояний сохранения/восстановления в бизоне, а если нет, то какой лучший способ справиться с такими ошибками.

ответ

1

bison не имеет возможности сохранять и восстанавливать состояния парсера. Возможно, вы могли бы создать его путем обратного проектирования скелета бизона, но это было бы очень много работы, и это также было бы довольно хрупким, поскольку время выполнения бизонов может измениться без предупреждения. (Чтобы быть справедливым, вам не нужно обновлять бизон, но вы, вероятно, хотите, чтобы это было возможно.)

Однако разбор довольно быстрый. В среде REPL вы не замечаете время синтаксического анализа. Таким образом, вам нечего останавливать, просто переписывая ввод с самого начала, вплоть до строки перед ошибкой.

Однако есть улов: парсеры-бизоны не обязательно обнаруживают синтаксическую ошибку до тех пор, пока не будет прочитан токен (хотя иногда это происходит, в зависимости от точной природы ошибки). Таким образом, вы не можете быть уверены, что последняя строка, прочитанная, представляет собой строку, на самом деле содержащую синтаксическую ошибку.

+0

Я не 100% уверен, что если правильный способ реализации Repl путь я предложил. Например, я могу только обнаруживать состояния с начала пользовательской строки до ошибки. Но возможно, что другие правила на линии действительно преуспели (например: «i = 1; b =;») – JayTaph

0

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

http://www.gnu.org/software/bison/manual/html_node/Push-Decl.html

+0

, если был интерфейс yystate_copy(), то он обеспечил бы именно то, что ищет OP. Но, похоже, такого не бывает. Конечно, копирование стека сложно, поскольку оно может содержать произвольные пользовательские объекты, поэтому я могу понять, почему такого интерфейса нет. В случае REPL контрольная точка синтаксического анализа является чрезмерной, но для нее может быть полезно ее использование, если вы ищете запросы функций. – rici

Смежные вопросы