実現したいこと
次のような形で,JSON形式の抽象構文木が文字列の形で得られるのを,文字列としてのJSON形式でなく,中身としてのJSON形式で得たいです.
「該当ソースコード」の部分でいう,program
にこの文字列が入っています.
JavaScript
1'{ 2 "Token": { 3 "Token": { 4 "type": "LOOP", 5 "literal": "loop" 6 } 7 }, 8 "Expression": { 9 "Token": { 10 "Token": { 11 "type": "LOOP", 12 "literal": "loop" 13 } 14 }, 15 "Condition": { 16 "Token": { 17 "Token": { 18 "type": "INT", 19 "literal": "10" 20 } 21 }, 22 "Value": 10 23 }, 24 "Consequence": { 25 "Token": { 26 "Token": { 27 "type": "LBRACE", 28 "literal": "{" 29 } 30 }, 31 "Statements": [ 32 { 33 "Token": { 34 "Token": { 35 "type": "IDENT", 36 "literal": "play" 37 } 38 }, 39 "Expression": { 40 "Token": { 41 "Token": { 42 "type": "LPAREN", 43 "literal": "(" 44 }, 45 "Function": { 46 "Token": { 47 "Token": { 48 "type": "IDENT", 49 "literal": "play" 50 }, 51 "Value": "play" 52 } 53 } 54 }, 55 "Arguments": [ 56 { 57 "Token": { 58 "Token": { 59 "type": "INT", 60 "literal": "60" 61 } 62 }, 63 "Value": 60 64 }, 65 { 66 "Token": { 67 "Token": { 68 "type": "FLOAT", 69 "literal": "0.1" 70 } 71 }, 72 "Value": 0.1 73 } 74 ] 75 } 76 } 77 ] 78 } 79 } 80} '
困っていること・試したこと
JSON.JSON.stringify
でJSON形式を得ようと思ったのですが,この関数を使用すると,
JSON.JSON.stringify("{true}"); // '"{true}"'
のような形で得てしまっているのですが,ほしいのは'{true}'
なのでずれが生じてしまっています.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
前提
該当のソースコード
JavaScript
1var xml = ""; 2function makeAST(){ 3 var scriptdata = document.getElementById("codeInput").value; 4 const l = newLexer(scriptdata); 5 const p = newParser(l); 6 const program = p.parseProgram(); 7 checkParserErrors(p); 8 9 const JSONobj = JSON.stringify(program) 10 xml = makeXML(JSONobj); 11 return; 12} 13 14// Function to convert JSON AST to XML 15function makeXML(ast) { 16 let xml = ''; 17 xml += '<xml xmlns="http://www.w3.org/1999/xhtml">'; 18 xml += traverseAST(ast); 19 xml += '</xml>'; 20 return xml; 21} 22 23// Function to traverse the AST and generate XML 24function traverseAST(node) { 25 let xml = ''; 26 // Handle different types of nodes in your AST 27 if (node.Token && node.Token.type === 'LOOP') { 28 xml += '<block type="controls_repeat_ext" id="T,:lx`qH6`%re*cN8lOx" x="-5" y="23">'; 29 xml += '<value name="TIMES">'; 30 xml += `<shadow type="math_number" id="GamoPT;mPC@7[FE#B4W!"><field name="NUM">${node.Expression.Condition.Value}</field></shadow>`; 31 xml += '</value>'; 32 xml += '<statement name="DO">'; 33 xml += traverseStatements(node.Expression.Consequence.Statements); 34 xml += '</statement>'; 35 xml += '</block>'; 36 } 37 // Add handling for other types of nodes as needed 38 return xml; 39}
追記
JSON.parse(program)
にしたときのエラー内容
正しい手順かわかりませんが,JSON.stringify
を通したらエラーは消えました.
VM2756:1 Uncaught SyntaxError: "[object Object]" is not valid JSON at JSON.parse (<anonymous>) at makeAST (script.js:404:24) at HTMLButtonElement.onclick (index.html:74:349)
条件の修正
JavaScript
1function traverseAST(node) { 2 let xml = ''; 3 // Handle different types of nodes in your AST 4 if (node.Token && node.Token.Token && node.Token.Token.type === "LOOP") { 5 xml += '<block type="controls_repeat_ext" id="T,:lx`qH6`%re*cN8lOx" x="-5" y="23">'; 6 xml += '<value name="TIMES">'; 7 xml += `<shadow type="math_number" id="GamoPT;mPC@7[FE#B4W!"><field name="NUM">${node.Expression.Condition.Value}</field></shadow>`; 8 xml += '</value>'; 9 xml += '<statement name="DO">'; 10 xml += traverseStatements(node.Expression.Consequence.Statements); 11 xml += '</statement>'; 12 xml += '</block>'; 13 } 14 // Add handling for other types of nodes as needed 15 return xml; 16} 17 18// Function to traverse statements inside a block 19function traverseStatements(statements) { 20 let xml = ''; 21 statements.forEach(statement => { 22 if (statement.Token && statement.Token.Token && statement.Token.Token.type === 'IDENT') { 23 xml += `<block type="${statement.Token.Token.literal}" id="${generateUniqueId(24)}" x="-5" y="23">`; 24 xml += '<field name="Note No.">'; 25 xml += statement.Expression.Arguments[0].Value; 26 xml += '</field>'; 27 xml += '<field name="during">'; 28 xml += statement.Expression.Arguments[1].Value; 29 xml += '</field>'; 30 xml += '</block>'; 31 } 32 // Add handling for other types of statements as needed 33 }); 34 return xml; 35}
ログ確認
JavaScript
1function makeAST(){ 2 var scriptdata = document.getElementById("codeInput").value; 3 scriptdata = changeBackSlashIntoSpace(scriptdata); 4 // console.log(scriptdata); 5 const l = newLexer(scriptdata); 6 const p = newParser(l); 7 const program = p.parseProgram(); 8 checkParserErrors(p); 9 10 console.log(typeof(program)); 11 console.log(program); 12 13 const JSONobj = JSON.stringify(program) 14 console.log(typeof(JSONobj)); 15 console.log(JSONobj); 16 const JSONparse = JSON.parse(JSONobj) 17 xml = makeXML(JSONparse); 18 console.log(xml); 19 return; 20}
console.log(typeof(program));
の結果はobject
でした.
console.log(program)
の結果
console.log(typeof(JSONobj));
の結果はstring
console.log(JSONobj);
の結果は次のようになっています.
{"Statements":[{"Token":{"Token":{"type":"LOOP","literal":"loop"}},"Expression":{"Token":{"Token":{"type":"LOOP","literal":"loop"}},"Condition":{"Token":{"Token":{"type":"INT","literal":"10"}},"Value":10},"Consequence":{"Token":{"Token":{"type":"LBRACE","literal":"{"}},"Statements":[{"Token":{"Token":{"type":"IDENT","literal":"play"}},"Expression":{"Token":{"Token":{"type":"LPAREN","literal":"("},"Function":{"Token":{"Token":{"type":"IDENT","literal":"play"},"Value":"play"}}},"Arguments":[{"Token":{"Token":{"type":"INT","literal":"60"}},"Value":60},{"Token":{"Token":{"type":"FLOAT","literal":"0.1"}},"Value":0.1}]}},{"Token":{"Token":{"type":"IDENT","literal":"play"}},"Expression":{"Token":{"Token":{"type":"LPAREN","literal":"("},"Function":{"Token":{"Token":{"type":"IDENT","literal":"play"},"Value":"play"}}},"Arguments":[{"Token":{"Token":{"type":"INT","literal":"0"}},"Value":0},{"Token":{"Token":{"type":"FLOAT","literal":"0.0"}},"Value":0}]}},{"Token":{"Token":{"type":"IDENT","literal":"play"}},"Expression":{"Token":{"Token":{"type":"LPAREN","literal":"("},"Function":{"Token":{"Token":{"type":"IDENT","literal":"play"},"Value":"play"}}},"Arguments":[{"Token":{"Token":{"type":"INT","literal":"0"}},"Value":0},{"Token":{"Token":{"type":"FLOAT","literal":"0.0"}},"Value":0}]}}]}}}]}