Last active
October 4, 2022 17:32
-
-
Save brecert/f622c687be0067e1f3abcf5a45589805 to your computer and use it in GitHub Desktop.
yaml to s-expressions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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