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