Ссылочная переменная в кавычках LLVM

Как вы передаете переменную в квазицитированный раздел?

Я использую llvm-quote-general и хотел бы пройти Type в инструкции, которую я строю с помощью квазиквотера.

Я могу построить инструкцию только из текста:

alloci64 :: Instruction
alloci64 = [lli|alloc i64|]

Я хотел бы быть в состоянии передать тип. Какой синтаксис для этого?

alloc :: Type -> Instruction
alloc t = [lli|alloc t|]

Я перепробовал все следующее, и ни один из них не сработал. Они приводят к lexer error s.

[lli|alloc $t|]
[lli|alloc $$t|]
[lli|alloc $t$|]
[lli|alloc $$t$$|]

Квазиквотер в библиотеке сгенерирован счастливым. Просматривая исходный код, самое близкое, что я могу найти для токена в отношении анти-цитаты, это символ happy_dollar_dollar который, кажется, нигде не определен.

Изменить: я решил проблему для Type s; пример [lli|alloc $type:t]

Операнды

Я решил проблему с Type с, но до сих пор не могу понять, как вообще ничего не цитировать. Я хотел бы использовать Operandстроит инструкцию. Попытка сделать это приводит к ошибке.

add' :: Operand -> Operand -> Instruction
add' a b = [lli|add $opr:a $opr:b|]
                    ^
                    parse error on `ANTI_OPR'

Предварительно счастливый источник предполагает, что все следующее, включая $opr: должен сделать что-то

<0> {
 "$dl:"           / { allowAnti } { lexAnti Tanti_dl }
 "$dlM:"           / { allowAnti } { lexAntiM Tanti_dl }
 "$tt:"           / { allowAnti } { lexAnti Tanti_tt }
 "$ttM:"           / { allowAnti } { lexAntiM Tanti_tt }
 "$def:"          / { allowAnti } { lexAnti Tanti_def }
 "$defM:"          / { allowAnti } { lexAntiM Tanti_def }
 "$defs:"         / { allowAnti } { lexAnti Tanti_defs }
 "$defsM:"         / { allowAnti } { lexAntiM Tanti_defs }
 "$bb:"           / { allowAnti } { lexAnti Tanti_bb }
 "$bbM:"           / { allowAnti } { lexAntiM Tanti_bb }
 "$bbs:"          / { allowAnti } { lexAnti Tanti_bbs }
 "$bbsM:"          / { allowAnti } { lexAntiM Tanti_bbs }
 "$instr:"        / { allowAnti } { lexAnti Tanti_instr }
 "$instrM:"        / { allowAnti } { lexAntiM Tanti_instr }
 "$instrs:"       / { allowAnti } { lexAnti Tanti_instrs }
 "$instrsM:"       / { allowAnti } { lexAntiM Tanti_instrs }
 "$type:"         / { allowAnti } { lexAnti Tanti_type }
 "$typeM:"         / { allowAnti } { lexAntiM Tanti_type }
 "$opr:"          / { allowAnti } { lexAnti Tanti_opr }
 "$oprM:"          / { allowAnti } { lexAntiM Tanti_opr }
 "$const:"        / { allowAnti } { lexAnti Tanti_const }
 "$constM:"        / { allowAnti } { lexAntiM Tanti_const }
 "$id:"           / { allowAnti } { lexAnti Tanti_id }
 "$idM:"           / { allowAnti } { lexAntiM Tanti_id }
 "$gid:"          / { allowAnti } { lexAnti Tanti_gid }
 "$gidM:"          / { allowAnti } { lexAntiM Tanti_gid }
 "$param:"        / { allowAnti } { lexAnti Tanti_param }
 "$paramM:"        / { allowAnti } { lexAntiM Tanti_param }
 "$params:"       / { allowAnti } { lexAnti Tanti_params }
 "$paramsM:"       / { allowAnti } { lexAntiM Tanti_params }
}

1 ответ

Решение

Возиться еще немного, следующие работали

alloc :: Type -> Instruction
alloc t = [lli|alloc $type:t|]

Строка "type" был в исходном коде и другие примеры содержат текст, как $exp:e1 не объясняя, что это такое.

Другие вопросы по тегам