2016-11-11 4 views
3

Мой Lexer должен отличать скобки и поддерживать стопку открытых скобок во время лексинга. Для этого я указал вспомогательную функцию в моей FSL файле так:FsLex прерывает с ошибкой разбора на '{'

let updateBracketStack sign = // whenever a bracket is parsed, update the stack accordingly 
    match sign with 
    | '[' -> push sign 
    | '{' -> push sign 
    | ']' -> if top() = '[' then pop() else() 
    | '}' -> if top() = '{' then pop() else() 
    | _ ->() 

Стек конечно это ссылка из списка полукокса. Соответственно реализуются push, top, pop.

Проблема в том, что все работало до тех пор, пока я не добавил символ {. Теперь FsLex просто умирает с error: parse error

Если изменить символы в строки, то есть написать "{" FsLex прекрасно снова, так что обходной путь будет изменить реализацию в стек строк вместо символов.

Вопрос, однако, откуда это происходит? Это ошибка, если FsLex?

+1

код Вы разместили имеет 'верх()' 's на результат сравнивается с '' [ '' (полукокса) в одной ветви матч, и' "{" '(строка) в другой спичечной ветке. Это не должно компилироваться! Возвращаемый тип 'top()' может быть либо 'char', либо' string', но в любом случае компилятор F # должен давать вам ошибку типа в одной из этих двух ветвей. Вы уверены, что вы не сделали ошибку копирования и вставки где-нибудь вставить в свой код для этого вопроса? – rmunn

+0

Исправлена ​​опечатка, спасибо. Однако это не связано с вопросом. Компилятор F # не компилируется, но fslex не может принять вход и сгенерировать любой код F #. –

ответ

0

Парсер FsLex генерируется с использованием FsLexYacc. Сообщение «ошибка синтаксического анализа» означает лексинг (вашего файла .fsl) до тех пор, пока положение ошибки не будет выполнено, но синтаксический анализ не будет выполнен в этой позиции. Чтобы найти основную причину, вам нужно будет отправить полный текст ввода в FsLex.

Это только догадка. FsLex может быть смущен символом '{', поскольку он также является открытым токеном для встроенного блока кода? Или ваш текст ввода содержит некоторые специальные символы Юникода, но он выглядит как пробел в редакторе?

Возможным обходным путем является создание другого модуля и файла .fs, модуля LexHelper в LexHelper.fs и размещение в нем вспомогательных функций и открытие его из файла .fsl.

EDIT

Глядя на исходный код FsLexYacc, он не обрабатывает} символов, заключенных в одинарные кавычки во встроенном F # код, но когда заключенный в двойные кавычки.

https://github.com/fsprojects/FsLexYacc/blob/master/src/FsLex/fslexlex.fsl