Что такое эквивалент fsyacc для следующего кода ocamlyacc? - PullRequest
3 голосов
/ 08 апреля 2011

Я работаю над игрушечным компилятором, используя F #, то есть комбинацию FsLex и FsYacc. Чтобы ознакомиться с ними, я прочитал главу «Эксперт F # (v2)», посвященную Lexer / Parser (кстати, хорошая книга). Прямо сейчас я на полпути к хорошо рекомендованному учебнику по ocamlyacc и остановился на последнем примере Многофункциональный калькулятор mfcalc . В частности, следующее утверждение

%token <float->float> FNCT

в файле синтаксического анализатора продолжает выдавать ошибку «error: parse error» в моей F # версии . Я что-то здесь упустил, или эта функция в настоящее время не поддерживается F #?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

Это похоже на ошибку. Добавление паренов не помогает. Я пробовал различные обходные пути, но я не мог найти чистый путь. Вы должны сделать сообщение об ошибке.

Если у вас есть только одна функция (как в учебном примере), вы должны определить тип в прелюдии:

type floatFunction = float -> float
...
%token <floatFunction> FNCT

Если у вас много функций, вы также можете определить универсальный тип:

type functionType<'a, 'b> = 'a -> 'b
...
%token < ('a, 'b) functionType > FNCT

Любая угловая скобка в типе приводит к ошибке разбора (даже functionType<float,float>).

0 голосов
/ 08 апреля 2011

Возможно, вам понадобится поставить символы скобок, например

%token <(float->float)> FNCT

Я забыл (я не на машине F # для проверки).

...