Можете ли вы привести примеры нечетных однострочных комментариев в C ++? - PullRequest
0 голосов
/ 24 октября 2009

Я написал метод для удаления однострочных комментариев из исходного файла C ++:


def stripRegularComments(text) {
  def builder = new StringBuilder()
  text.eachLine {
   def singleCommentPos = it.indexOf("//")
   def process = true
   if(singleCommentPos > -1)
   {
    def counter = 0
    it.eachWithIndex 
    { obj,i ->
     if((obj == '\'') || (obj == '"'))
      counter++
     if(i == singleCommentPos)
     {
      process = ((counter % 2) == 1)
      if(!process)
       return
     } 
    }</p>

<pre><code>if(!process)
{
 def line = it.substring(0,singleCommentPos)
 builder &lt;&lt; line &lt;&lt; "\n"
}
else
{
 builder &lt;&lt; it &lt;&lt; "\n" 
}

} еще { строитель

И я проверил это с:

println a.stripRegularComments("""
this is a test inside double quotes "//inside double quotes"
this is a test inside single quotes '//inside single quotes'
two// a comment?//other
single //comment
""")

Он производит такой вывод:

this is a test inside double quotes "//inside double quotes"
this is a test inside single quotes '//inside single quotes'
two
single

Есть ли случаи, по которым я скучаю?

Ответы [ 7 ]

11 голосов
/ 24 октября 2009

Веселые образуются из триграфов и продолжений строк. Мой личный фаворит:

/??/
* this is a comment *??/
/
10 голосов
/ 24 октября 2009
// Single line comments can\
actually be multi line.
6 голосов
/ 24 октября 2009

Я думаю, ты не справишься

  puts("Test \
    // not a comment");

и это также может создать проблемы:

  puts("'"); // this is a comment
5 голосов
/ 24 октября 2009

Вы не можете обработать экранированные кавычки, например:

"Comment\"//also inside string"

против

"Comment"//not inside string"
2 голосов
/ 24 октября 2009

Я думаю, вам не хватает дела /* comment */.

1 голос
/ 24 октября 2009

Обработка символа \ в конце строки выполняется на более раннем этапе перевода (этап 2), чем замена комментариев (этап 3). По этой причине комментарий // может фактически занимать более одной строки в исходном файле

// This \
whole thing \
is actually \
a single comment

P.S. Ох ... Я вижу это уже опубликовано. Хорошо, я оставлю это в живых только для упоминания фаз перевода:)

0 голосов
/ 25 октября 2009

Это всегда фаворит:

// Why doesn't this run?????????????????????/
foo(bar);
...