Ссылочная переменная в кавычках 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
не объясняя, что это такое.