2010-07-24 3 views
4

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

мне удалось построить лексер с помощью Алексы, что построить список лексем с локализацией:

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

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

%token FOO { Token _ $$ _ } 

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

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

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

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

В.

+0

На самом деле, это не представляется возможным даже в C flex/bison, поэтому его не должно быть возможно непосредственно в haskell или caml. Однако я мог бы использовать кортеж данные Token = Token (AlexPosn, Foo, Bar)) вместо нескольких аргументов. Я оставляю вопрос открытым на несколько дней, но я думаю, что я скоро закрою его. . – Vinz

ответ

4

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

  • вьючных все данные значения в кортеже, так что $$ точка этого набора, а затем извлечь данные проекцией:

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

    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 
    

    ...

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

+1

+1 для ответа на свой вопрос - это спасло меня от хлопот! – Jack

+0

Да, большое спасибо. –