Skip to content

Instantly share code, notes, and snippets.

@brecert
Last active October 4, 2022 17:32
Show Gist options
  • Save brecert/f622c687be0067e1f3abcf5a45589805 to your computer and use it in GitHub Desktop.
Save brecert/f622c687be0067e1f3abcf5a45589805 to your computer and use it in GitHub Desktop.
yaml to s-expressions
https://flems.io/#0=N4IgtglgJlA2CmIBcA2ArAOgJwA4A0IAzgMYBOA9rLMgNoCMdaATBgOxp4AMAugQGYQEhWqAB2AQzCIkIDAAsALmGoFi5UQvgbkIEAF88YydNkArYavWbtMiGAAO5UgoAEATQCCAWQAyLvhRgLgDkigr2hEgA9FHm9mAYUPAAblEAnpKwwQDcADqi+WqihK4Zyi4AvO7ePhj24qSE8AAUAAb5YORQAK4ISPkuLgC0LlKdpGlILvAAHo7OLrng8ONpS3gudAPDLlDiCuJTEADMLEUlLpwbS3LwVOQuCrek8ACES9sjfN2ixFMAPttBoNZvNXEsAOYveAKCCiCHrFwvQi9VwnJgudFA4HZbIuch8PhNVwElwlUhwiGY0SjFZONY04GDdEYc6uTjYwa4lwIeFPTmY06s9QXOhMfKtACUeQKvxFrlB8GImigAHluvZuq4qu1RM1Oj0ENt9XSJi5mqCnODlmAlpLNpLjXsDuaWWzLvabndYA8nvAXu8QI7Gc1vr9zZaFpDobD4QB9O3m5GowUY9HBpnNN3yj1M7kEokw-F8MkKCnw6m01bYrNC91i+1cvG8iH8xnByWtGX5MPKiDqFz1RrwHxw+AAUTmpGasDHGwEElg9uA23doMalR5Y4whHss4UzWCeGCkowYHE9gtlQAfNMMGW7M1JRmkTDuqQaevCGeL80LVONgge0KlvFdGWZPg-wXcRYBcAAyODMUqCoqi-DAWyeIY6Htf5-mmKcdwOZxCAAdQgJ5D1xE9lwFF4FHfT8p2xPRplgJoXDAplBjohiXFaZoABJgHXPRO2Y7ZRIwUxyDhQ8QmDPR8h7H4+wHIcmi8VFBDHSd7GnWdRHgQhAJoxl3XILVNxobhVxzBpSHENJCE3AyjJ3PdyMPXJ8hPbY+CcGciwgTdODxYKAB4XHsxzvwwuQwoAagS0ymQQVxXM3aKnJoCBuBlJkIEgjKUKqYITxcIpY26eBsTSwcGiaKBN3UkcdKnGc5yQkqotIBynPQrRWzkLCX0GCyFDqbpCDkZoWqgF9FMZHiP3xLUpJkvVgm80RghcBKQkGYIMBeex4H2LNnz281xoGvk5BcW86BcAB+EJtt2-bdqOk6zoPICXCmMqFKU0Re1hNSGvgDxesc5osuMzEUoqnNxqsmzGX8-SgpCsKXEi+HbqGxLko42qi2Knq+sIHK8uxQqOsM5DSvKyq4WqsnXDm5rIYZ+BAKu7DsRuzVptmyH5ok7ZlsZLafKu3aQmO+BTvO-79pu6TZNlnb5cOpWVb+y7Pve3XFZ+1WdieyLOBey4AaQkZBdERblN+cGaRa1UACNTCVA9yB9kzSaWt8Vu933lQwLQHyM5oA9MU9z0vZoaAkKQNmdcRuGA69sX4oS0-gFihJa5pM-5-bsNE3VBmB2Uwf7D2efLrrc04zFIOhvqMAgQgu9hzPLvb7jQ6b4d+7SMv9nEEyJNY9jCvNBQ0lO0lM6ZxYiAfeFE2H196JWlrNNgWFXN06cW6Aue7nYvfpfq4dw79qeDhM9atfehb8hd0QoHIYhuhSA0BgAA7hSTQYthzNDKEueWn98h-wAUAiaYDyItFLu3A0vR4BTBoNiYAVZ6SA0jNaMYiI6C7QMPg3Y09AbZmKOya4IBbj3EeM8N4SxKF4HwQKXsxC5hWk3lCeAMJKQJhABsZMJ9Uypm2vmQkxJiylnLFSOEhCJjbXoRcDk+RuRxU0XWHMYp3rcPAi4KhjJeDf3yPaY2PlJQSKIHcP2jdhAyE4EgTgQwcAABYkBYH0IYEAhcdCskIBYEAlVo46EUOUduXtxDEAANZQgsr-KYABiMUdBOCMHysjH0pBMl8GICUkp+SQFyDQUMXciScGDheDKPQjimgIFUsUHQxwkB0ACXobgeggA
import YAML from 'https://jspm.dev/yaml';
const yaml = YAML.parse(`
module:
- memory: export "memory", 1
- data: i32.const 0, "hello there!"
- func: |
export "greeting", result i32 i32
;; offset of string in memory
i32.const 0
;; length
i32.const 12
`);
const expectedOuput = `
(module
(memory (export "mem") 1)
(data (i32.const 0) "hello there!")
(func (export "greeting_") (result i32 i32)
(i32.const 0) ;; offset of string in memory
(i32.const 12) ;; length
)
)`;
function parseLineExpr(line, final) {
const exprs = line.split(',').map(e => e.trim())
return exprs.map((expr, i) => {
if((final && i === exprs.length-1) || expr.startsWith(';;')) {
return expr
} else {
return `(${expr})`
}
}).join(' ')
}
function parseMultilineExpr(lines, i) {
const out = []
const arrays = lines.split('\n')
for(let i = 0; i < arrays.length; i++) {
let line = arrays[i];
if(line === '') continue
let parsed = parseLineExpr(line, i === arrays.length-1)
out.push(parsed)
}
return out.join('\n' + ' '.repeat(i)) + (out.length > 1 ? '\n' + ' '.repeat(i) : '')
}
function parseArray(arrays, i) {
const out = []
for(let i = 0; i < arrays.length; i++) {
let line = arrays[i];
if(line === '') continue
let parsed = parse(line, i + 1)
out.push(parsed)
}
return '\n' + ' '.repeat(i) + out.join('\n' + ' '.repeat(i)) + '\n' + ' '.repeat(i - 1 < 0 ? 0 : i - 1)
}
function parseObject(obj, i) {
return Object.entries(obj).map(([name, data]) =>
`(${name} ${parse(data, i + 1)})`
)
}
function parse(data, i = 0) {
if(Array.isArray(data)) {
return parseArray(data, i)
} else if (typeof data === "string") {
return parseMultilineExpr(data, i)
} else {
return parseObject(data, i).join('\n')
}
}
document.write(parse(yaml) + '\n')
document.write(parse({
module: [
{ memory: 'export "mem", 1' },
{ data: 'i32.const 0, "hello there!"' },
{
func: 'export "greeting_", result i32 i32\n;; offset of string in memory\ni32.const 0\n;; length\ni32.const 12\n',
},
],
}
) + '\n')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment