سؤال

هل يمكن لأي شخص أن يوجهني إلى برنامج يقطع سلاسل من شفرة المصدر C؟ مثال

#include <stdio.h>
static const char *place = "world";
char * multiline_str = "one \
two \
three\n";
int main(int argc, char *argv[])
{
        printf("Hello %s\n", place);
        printf("The previous line says \"Hello %s\"\n", place);
        return 0;
}

يصبح

#include <stdio.h>
static const char *place = ;
char * multiline_str = ;
int main(int argc, char *argv[])
{
        printf(, place);
        printf(, place);
        return 0;
}

ما أبحث عنه هو برنامج يشبه إلى حد كبير streamcmt.فقط أنني أريد أن أجريت السلاسل وليس التعليقات.

السبب في أنني أبحث عن برنامج متطور بالفعل وليس مجرد تعبير منتظم مفيد لأنه عند البدء في التفكير في جميع حالات الزاوية (اقتباسات داخل السلاسل، سلاسل متعددة الأقطار وغيرها) تبدأ الأشياء عادة (كثيرا) أكثر تعقيدا من ذلك يظهر أولا. وهناك قيود على ما يمكن أن يحققه الدقة، أظن أنه ليس من الممكن لهذه المهمة. إذا كنت تعتقد أن لديك الى ابعد حد تعبير عادي قوي لا تتردد في الخضوع، ولكن من فضلك لا ساذج sed 's/"[^"]*"//g' مثل الاقتراحات.

(لا حاجة للتعامل مع السلاسل الخاصة (ربما غير المنتهية) في التعليقات، ستتم إزالة تلك أولا)

دعم السلاسل متعددة الخطوط مع خطوط جيولاين مضمنة غير مهم (وليس قانوني ج)، ولكن السلاسل التي تمتد إلى خطوط متعددة تنتهي مع في النهاية يجب أن تكون مدعومة.

هذا هو نفسه تقريبا بعض آخر أسئلة, ، لكنني وجدت أي إشارة إلى أي أدوات.

هل كانت مفيدة؟

المحلول

يمكنك تنزيل شفرة المصدر إلى StripCMT (.tar.gz - 5 كيلو بايت). إنه صغير تافهة، ولا ينبغي أن يكون من الصعب للغاية التكيف مع سلاسل الشريط بدلا من ذلك (إنه صدر تحت GPL).

قد ترغب أيضا في التحقيق في قواعد اللغة المعجمية الرسمية لأسلوت ج. وجدت هذه بسرعة كبيرة، ولكن قد لا تكون نهائية. يحدد سلسلة على النحو التالي:

stringcon ::= "{ch}", where ch denotes any printable ASCII character (as specified by isprint()) other than " (double quotes) and the newline character.

نصائح أخرى

جميع الرموز في C (ومعظم لغات البرمجة الأخرى) هي "منتظمة". وهذا هو، يمكن أن يقابلها تعبير منتظم.

تعبير منتظم عن سلاسل ج:

"([^"\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))*"

Regex ليس من الصعب جدا فهمها. أساسا سلسلة حرفية هو زوج من الاقتباسات المزدوجة المحيطة بمجموعة من:

  • أحرف غير خاصة (غير اقتباس / خلفية / نيولاين)
  • يهرب، الذي يبدأ بخلفية خلفية ثم يتكون من واحد من:
    • شخصية هروب بسيطة
    • 1 إلى 3 أرقام ثمانية
    • X و 1 أو أكثر من أرقام السدس

يعتمد هذا على الأقسام 6.1.4 و 6.1.3.4 من المواصفات C89 / C90. إذا تسلل أي شيء آخر في C99، فلن يتمكن هذا الأمر، لكن لا ينبغي أن يكون من الصعب إصلاحه.

إليك برنامج نصي ثعبان لتصفية ملف مصدر C إزالة السلسلة اليدوية:

import re, sys
regex = re.compile(r'''"([^"\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))*"''')
for line in sys.stdin:
  print regex.sub('', line.rstrip('\n'))

تعديل:

لقد حدث لي بعد أن قمت بنشره أعلاه، بينما صحيح أن جميع الرموز المقدسة C منتظمة، من خلال عدم تكميل كل شيء لدينا فرصة للمتاعب. على وجه الخصوص، إذا أظهر اقتباس مزدوج فيما يجب أن يكون رمزا آخر، فيمكننا أن نرفض مسار الحديقة. لقد ذكرت أن التعليقات قد تم تجريدها بالفعل، وبالتالي فإن الشيء الآخر الوحيد الذي نحتاجه حقا للقلق بشأن حرفي حرفي (على الرغم من أن النهج الذي سأتناوله يمكن أن يمتد بسهولة للتعامل مع التعليقات كذلك). إليك برنامج نصي قوي أكثر قوة يعالج حرفيات الأحرف:

import re, sys
str_re = r'''"([^"\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))*"'''
chr_re = r"""'([^'\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))'"""

regex = re.compile('|'.join([str_re, chr_re]))

def repl(m):
  m = m.group(0)
  if m.startswith("'"):
    return m
  else:
    return ''
for line in sys.stdin:
  print regex.sub(repl, line.rstrip('\n'))

في الأساس، نجد سلسلة ورمز حرفي حرفي، ثم ترك حرف سحر وحدها ولكن تعرية حرفية السلسلة. Char Lirderal Regex يشبه إلى حد كبير السلسلة الحرفية الأولى.

في روبي:

#!/usr/bin/ruby
f=open(ARGV[0],"r")
s=f.read
puts(s.gsub(/"(\\(.|\n)|[^\\"\n])*"/,""))
f.close

يطبع إلى الإخراج القياسي

في بيثون باستخدام pyparing:

from pyparsing import dblQuotedString

source = open(filename).read()
dblQuotedString.setParseAction(lambda : "")
print dblQuotedString.transformString(source)

يطبع أيضا إلى Stdout.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top