なでしこ3のからまで繰り返すの、genを以下のようにしてみたのですが、いかがでしょうか。
convFor (node) {
const kara = this.convGen(node.from)
const made = this.convGen(
node.to)
const block = this.convGenLoop(node.block)
let word = ''
let varCode = ''
if (node.word !== null) {
word = this.convGen(node.word)
varCode = ''
} else {
// ループ変数を省略した時は、自動で生成する
const id = this.loop_id++
word = `$nako_i${id}`
varCode = 'let '
}
const id_f = this.loop_id++
const id_l = this.loop_id++
const code =
`const $nako_from${id_f}=${kara};` + '\n' +
`const $nako_to${id_l}=${made};` + '\n' +
`if($nako_from${id_f}<=$nako_to${id_l}){` + '\n' +
` for(${varCode}${word}=$nako_from${id_f}; ${word}<=$nako_to${id_l}; ${word}++)` + '{\n' +
` ${this.sore} = ${word};` + '\n' +
' ' + block + '\n' +
' };\n' +
'}else{\n' +
` for(${varCode}${word}=$nako_from${id_f}; ${word}>=$nako_to${id_l}; ${word}--)` + '{\n' +
` ${this.sore} = ${word};` + '\n' +
' ' + block + '\n' +
' };\n' +
'};\n'
return this.convLineno(node) + code
}
降順にも対応になる代わりに、命令が結構増えてしまうので、元の日本語の命令そのものを分けたほうが良いのかもしれません。
(もしくは、「づつ」を追加するとか)