2011-12-30 13 views
1

私は自分のアプリケーションで簡単なスクリプトインタプリタを作ろうとしています。私のアプリケーションで使用するための有効なスクリプトは次のようになります。非常に簡単なインタプリタをC言語で書く#

#this is a comment 
*IDN? #this is a comment after a valid command 
:READ? #this was also a comment after a valid command 
RST 
#last line was a valid comment but with no comment! 

今、私はそれが#を開始し、また中#をignorていない場合は、各ラインを実行したい文字列の配列内のスクリプトの内容をロードした後それ以外の場合は同じ行:

foreach(var command in commands) 
    { 
     if(!command.StartsWith("#")) 
     { 
      _handle.WriteString(command); 
     } 
    } 

私のコードは、コメントの開始を世話します。しかし、インラインコメントをチェックする方法は?

私はこのアイデアを得ました。このコードはIDIOT-PROOFですか?

 foreach(var command in commands) 
     { 
      if(!command.StartsWith("#")) 
      { 
       if(command.IndexOf('#') != null) 
       { 
        _handle.WriteString(command.Remove(command.IndexOf('#'))); 
       } 
      else 
       _handle.WriteString(command); 
      } 
     } 
+1

シンプルです。 '#'の後には何も実行しないでください。 –

+0

ええ、しかし、コマンドの後に#行があるか調べるには? –

+2

私は当面、インラインコメントを扱い、残りの通訳者に焦点を当てる方法に伴う小さな困難を無視することをお勧めします。終了したら、インラインコメントの処理方法を知ることができます。 ;-D –

答えて

4

あなたの質問を修正してください - フレーズにもう一つの方法は、それはあなたの最初の#記号の前に表示される各ラインの一部を処理したいということです。これはString.Splitによって返される配列の最初の要素のようになります。

foreach(var command in commands) 
{ 
    var splits = command.Split('#'); 
    if(!String.IsNullOrEmpty(splits[0])) 
    { 
     _handle.WriteString(splits[0]); 
    } 
} 

そして、それは行に表示されますどこにこれは今、#文字を扱います。

+0

スクリプト言語で文字列リテラルの概念が必要な場合は、これを使用するように注意してください。'CMD 'の一部のリテラル"#this is a comment "は正しく解析されません。 –

+0

@ M.Babcock - 合意されているように、 '# 'がコマンド内で出現することが許されていれば、すべてがはるかに複雑になります。現時点では、上記はOPの例と試行と一致しますが、より複雑な可能性を念頭におく価値があります。 –

+0

私は過去にこのアプローチを何度か繰り返してきたので、あなたは私のアップフォートを手に入れました。私はまた数回噛まれたので、免責条項を追加するとわかったのです。 –

1

#の後のすべてを取り除くだけです。この正規表現は、コメントの前の空白も削除します。残っているものがあれば、おそらくコマンドでしょう。

using System.Text.RegularExpressions; 

... 

command = Regex.Replace(command, @"\s*#.*$", ""); 
if (command != "") 
{ 
    // this is a command, not a comment line 
    // and any comment has been stripped off 
} 

私は#前に空白のみを剥離されているため、「おそらく」と言います。空白で問題が発生した場合は、Trimを文字列に変換してください。

+0

+1正解ですが単純ではありません:) – mellamokb

+0

Eh。あなたが正規表現を知っていれば地獄のように単純:) – cHao

2

Ironyをご覧ください。それはあなたが試みているように、カスタムメイドの "言語"を解析するために使用できるフレームワークです。コマンドや構文などを定義することができます。アルファステートですが、目的に応じて十分に安定しているはずです。

ドメイン固有の独自の言語を作成する場合は、this Irony tutorialをチェックしてください。

関連する問題