2011-12-30 5 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! 

Теперь после загрузки содержимого сценария внутри массива строки, я хочу, чтобы выполнить каждую строку, если она не начинается с #, а также игнор # в такая же строка, если она exsist:

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

Rephrase вашего вопроса - еще один путь к фразе она является то, что вы хотите, чтобы обработать часть каждой строки, которая появляется перед первым # знака. Какой бы первый элемент массива, возвращаемого String.Split:

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

И это сейчас имеет дело с # характера, где бы он появляется в строке.

+0

Просто будьте осторожны с этим, если ваш язык сценариев требует концепции строковых литералов.'CMD" некоторый # литерал "#this является комментарием" не будет правильно проанализирован. –

+0

@ M.Babcock - согласен, если '' '' разрешено появляться внутри команд, все становится намного сложнее. На данный момент приведенное выше соответствует примерам и попыткам OPs, но стоит учитывать более сложные возможности. –

+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 ming вашей строкой, если пробел вызывает проблемы.

+0

+1 Правильно .. но не просто :) – mellamokb

+0

Eh. Просто, если вы знаете регулярное выражение :) – cHao

2

вы можете взглянуть на Irony. Это структура, которая может использоваться для анализа пользовательских «языков», как вы пытаетесь. Вы сможете определить набор команд и синтаксиса и т. Д. Несмотря на то, что это альфа-состояние, для вас оно должно быть достаточно стабильным.

Проверьте this Irony tutorial, чтобы создать свой собственный родной язык.

Смежные вопросы