実現したいこと
次のような形で,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
5/4
追記部分のJSONparse
の出力結果で,先頭部分にToken.Token.type
にLOOP
があることを想定してJSを書いているのですが,ログを見てみると最初からINT
が見えていて,それが原因でif文に入っていないのでは,でもなぜ無くなっているのか分からない,というのが現状です.
該当のソースコード
下部の追記にリポジトリとして関係するファイルはすべて置かせていただいております.
ここに記載していたコードは,追記にて修正を行ったので,質問文の簡潔化を図るために省略しております.
追記
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}]}}]}}}]}
console.log(JSONparse);
の結果は次のようになっています.
リポジトリ
コードの細かい部分は以下のリポジトリとして置かせていただきます.
https://github.com/snym-yt/testLanguageSettings
index.html
, JSPMusic
フォルダ, script.js
, ASTtoXML.js
が該当ファイルとなります.
「ブロック化」というボタンを押すだけで今回試したいことが実行されるようにしております.

回答2件
あなたの回答
tips
プレビュー