質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1447閲覧

coffeescriptでのsyntax highlight

inblanket

総合スコア18

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2015/03/18 02:45

編集2015/03/18 02:58

coffeescriptでシンタックスハイライトを実装したくて次のようなコードを書いたところ、途中までうまく行っているのですが最後の文字が繰り返されるようになってしまいました。

lang

1code = """ 2<script src="./string"></script> 3""" 4html = "" 5 6defo = """ 7 var nibe = function (){ 8 switch (false) { 9 case !(code === ""): 10 return html; 11 case !/^"/.test(code): 12 html += "<quote>\\\""; 13 code = code.replace(/^"/, ""); 14 highlight(quote); 15 case !/^./.test(code): 16 html += RegExp.lastMatch; 17 code = code.replace(/^./, ""); 18 highlight(defo); 19 } 20 } 21""" 22quote = """ 23 var nibe = function (){ 24 switch (false) { 25 case !(code === ""): 26 return html; 27 case !/^"/.test(code): 28 html += "\\\"</quote>"; 29 code = code.replace(/^"/, ""); 30 highlight(defo); 31 case !/^./.test(code): 32 html += RegExp.lastMatch; 33 code = code.replace(/^./, ""); 34 highlight(quote); 35 } 36 } 37""" 38highlight = (rule) -> 39 eval(rule) 40 nibe() 41 html 42 43console.log highlight(defo) 44

コードの内容はhighlight関数の引数にシンタックスハイライトの条件をいれ、それをevalで実行するコードを再帰的に動かすことで動的に条件を変更しながらダブルクオーテーション「"」とその中身を<quote></quote>で囲むというものです。

ですが、これをnode.jsでnode highlight.js(上のコードをコンパイルしたもの)と実行したところ結果は

<script src=<quote>"./string"</quote>></script>>>

となり最後の文字の>が不必要に増えてしまっています。

ダブルクオーテーションの数だけ最後の文字が増えるのでシンタックスハイライトの条件を変えるためにhighlight()の引数を変えるときに何かおかしくなっているのだと思いますが僕には理由がわかりません。

console.logで変数の値を確認しながら動かしたところ一番最後のところでcodeの中身がもうなくなっているのに条件分岐の一番下である

lang

1 case !/^./.test(code): 2 html += RegExp.lastMatch; 3 code = code.replace(/^./, ""); 4 highlight(quote); 5コード

lang

1 case !/^./.test(code): 2 html += RegExp.lastMatch; 3 code = code.replace(/^./, ""); 4 highlight(defo); 5コード

これがcodeの中身が無いのにもかかわらずhtmlを返す一番上の条件が動かず、動いてしまっていました。

わかる方いらしたらどうしたら治るか教えて下さい。

--- 補足 ---
lexのような字句解析をやってくれるライブラリでオススメの物がjavascriptであればそれを教えてくださると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

以下のように変更。

lang

1defo = """ 2 var nibe = function (){ 3 switch (false) { 4 case !(code === ""): 5 return html; 6 case !/^"/.test(code): 7 html += "<quote>\\\""; 8 code = code.replace(/^"/, ""); 9 highlight(quote); 10 break; 11 case !/^./.test(code): 12 html += RegExp.lastMatch; 13 code = code.replace(/^./, ""); 14 highlight(defo); 15 } 16 } 17""" 18quote = """ 19 var nibe = function (){ 20 switch (false) { 21 case !(code === ""): 22 return html; 23 case !/^"/.test(code): 24 html += "\\\"</quote>"; 25 code = code.replace(/^"/, ""); 26 highlight(defo); 27 break; 28 case !/^./.test(code): 29 html += RegExp.lastMatch; 30 code = code.replace(/^./, ""); 31 highlight(quote); 32 } 33 } 34"""

おそらく、呼び出し元に戻ってきた時にフォールスルーされてます。case文の分岐判定はどうやらswitch文の時点で終わっているようですね。

投稿2015/03/18 09:06

編集2015/03/18 09:08
Lhankor_Mhy

総合スコア36140

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問