Как мы сохраняем несколько семантических ценностей во время разборки с Happy / Haskell

StackOverflow https://stackoverflow.com/questions/3324801

Вопрос

Я пытаюсь построить простой лексер / парсер с Alex / Happy в Haskell, и я хотел бы Держите некоторую информацию локализации из текстового файла в мою конечную AST.

Мне удалось построить Lexer, используя Alex, который создает список токенов с локализацией:

data Token = Token AlexPosn Foo Bar
lexer :: String -> [Token]
.

в моем счастливый файл, при объявлении части% токена, я могу объявить, что семантическая часть токена с символом $$

%token FOO  { Token _ $$ _ }
.

и в правиле разбора, $ я буду ссылаться на этот $$.

foo_list: FOO  { [$1] }
        | foo_list FOO { $2 : $1 }
.

Есть ли способ ссылаться на часть alexposn и для foo часть токена foo? Прямо сейчас я знаю только, как относится только к одному из них.Я могу найти информацию о том, как «добавить несколько $$» и обратиться к ним позже.

Есть ли способ сделать так?

v.

Это было полезно?

Решение

В конце концов, я нашел 2 решения:

    .
  • Упакуйте все значенные данные в кортеже, так что $$ указывают на этот кортеж, затем извлеките Данные проекцией:

    data Token = Token (AlexPosn,Foo) Bar
    %token FOO { Token $$ some_bar }
    rule : FOO  { Ast (fst $1) (snd $1) }
    
  • Не используйте $$ вообще: если вы не используете $$, Happy предоставит вам полный токен во время анализа, чтобы вы могли извлечь то, что вам действительно нужно от этого токена:

    data Token = Token AlexPosn Foo Bar
    %token FOO = { Token _ _ some_bar }
    rule : FOO  { Ast (get_pos $1) (get_foo $1) }
    
    get_pos :: Token -> AlexPosn
    get_foo :: Token -> Foo
    
    .

    ...

Я думаю, что первый - самый элегантный.Второй может быть довольно тяжелой в срок действия строк кода, если вы несите много информации: вам придется построить «прогнозы» вручную (сопоставление шаблона и т. Д.), И делать это безопасно, может быть сложноЕсли ваш тип токена довольно большой.

Другие советы

Также возможно сохранить несколько значений:

data Token = Token AlexPosn Foo Bar
%token FOO { Token pos foo some_bar }
rule : FOO { Ast pos foo }
.

Хотя я не уверен, что счастлив на самом деле гарантирует, что это всегда будет работать.Причина того, почему она работает (может быть) работает, это то, что счастливый будет генерировать код, который шаблон соответствует генеракодичению, создавая генеракодицетагкод и генеракодицетагкод, доступен в Token pos foo some_bar.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top