আমি একবার নিয়ে এসেছেন এই যা আমরা করতে পরিমার্জন করতে পারেন:
perl -0777 -pe '
BEGIN{
$bs=qr{(?:\\|\?\?/)};
$lc=qr{(?:$bs\n|$bs\r\n?)}
}
s{
/$lc*\*.*?\*$lc*/
| /$lc*/(?:$lc|[^\r\n])*
| (
"(?:$bs$lc*.|.)*?"
| '\''$lc*(?:$bs$lc*(?:\?\?.|.))?(?:\?\?.|.)*?'\''
| \?\?'\''
| .[^'\''"/?]*
)
}{$1 eq "" ? " " : "$1"}exsg'
আরও কয়েকটি কর্নারের কেসগুলি পরিচালনা করতে।
মনে রাখবেন যে আপনি যদি কোনও মন্তব্য মুছে ফেলেন , আপনি 1-/* comment */-1
কোডটির অর্থ পরিবর্তন করতে পারেন ( এমন 1 - -1
সময় পার্স করা হয়েছে 1--1
(যা আপনি মন্তব্যটি সরিয়ে দিলে আপনি পাবেন) আপনাকে একটি ত্রুটি দেয়))। মন্তব্যটি সম্পূর্ণরূপে অপসারণের পরিবর্তে স্থানের অক্ষর (যেমন আমরা এখানে করি) দিয়ে প্রতিস্থাপন করা ভাল।
উপরোক্তদের এই বৈধ এএনএসআই সি কোডটিতে সঠিকভাবে কাজ করা উচিত উদাহরণস্বরূপ যে কয়েকটি কোণার কেস অন্তর্ভুক্ত করার চেষ্টা করে:
# অন্তর্ভুক্ত <stdio.h>
প্রধান প্রধান ()
{
প্রিন্টফ ("% d% s% সি% সি% সি% সি% সি% সি% ডি \ n",
1 - / * মন্তব্য * / - 1,
/ \
* মন্তব্য * /
"/ * কোনও মন্তব্য নয় * /",
/ * বহুরেখা
মন্তব্য * /
'"' / * মন্তব্য * /, '"',
'\' ',' '' / * মন্তব্য * /,
'\
\
"', / * মন্তব্য * /
"\\
"/ * কোনও মন্তব্য নয় * /",
"?? /" / * কোনও মন্তব্য নয় * / ",
'??' '+' "'/ *" মন্তব্য "* /);
প্রত্যাবর্তন 0;
}
যা এই আউটপুট দেয়:
# অন্তর্ভুক্ত <stdio.h>
প্রধান প্রধান ()
{
প্রিন্টফ ("% d% s% সি% সি% সি% সি% সি% সি% ডি \ n",
1- -1,
"/ * কোনও মন্তব্য নয় * /",
'' ',' '',
'\' ',' '',
'\
\
" ',
"\\
"/ * কোনও মন্তব্য নয় * /",
"?? /" / * কোনও মন্তব্য নয় * / ",
'??' '+' "');
প্রত্যাবর্তন 0;
}
উভয়ই একই আউটপুট মুদ্রণ যখন কম্পাইল এবং চালানো হয়।
gcc -ansi -E
প্রাক-প্রসেসর এটিতে কী করবে তা দেখার জন্য আপনি আউটপুটটির সাথে তুলনা করতে পারেন। যে কোড এছাড়াও বৈধ C99 বা C11 কোড, তবে gcc
trigraphs ডিফল্টরূপে সমর্থন অক্ষম তাই এটা করবে সঙ্গে কাজ করে না gcc
, যদি না আপনার মত মান উল্লেখ gcc -std=c99
বা gcc -std=c11
অথবা অ্যাড -trigraphs
বিকল্প)।
এটি এই সি 99 / সি 11 (নন-এএনএসআই / সি 90) কোডটিতেও কাজ করে:
// মন্তব্য
/ \
/ মন্তব্য
// বহুরেখা
মন্তব্য
"// মন্তব্য নয়"
( gcc -E
/ gcc -std=c99 -E
/ সাথে তুলনা করুন gcc -std=c11 -E
)
এএনএসআই সি // form
মন্তব্যটির সমর্থন করেনি । //
এএনএসআই সিতে অন্যথায় বৈধ নয় তাই সেখানে উপস্থিত হবে না। এক কল্পিত কেস যেখানে //
সত্যি সত্যি ANSI সি প্রদর্শিত হতে পারে (যেমন সুপরিচিত সেখানে , এবং আপনি আলোচনা আকর্ষণীয় বাকি খুঁজে পেতে পারেন) যখন stringify অপারেটর ব্যবহার করা হচ্ছে।
এটি একটি বৈধ এএনএসআই সি কোড:
#define s(x) #x
s(//not a comment)
এবং 2004 সালে আলোচনার সময়ে, gcc -ansi -E
প্রকৃতপক্ষে এটি প্রসারিত করেছিল "//not a comment"
। যাইহোক, আজ gcc-5.4
এটিতে একটি ত্রুটি ফেরায়, তাই আমি সন্দেহ করব যে আমরা এই ধরণের কনস্ট্রাক্ট ব্যবহার করে প্রচুর সি কোড পেয়ে যাব।
জিএনইউ sed
সমমানের মতো কিছু হতে পারে:
lc='([\\%]\n|[\\%]\r\n?)'
sed -zE "
s/_/_u/g;s/!/_b/g;s/</_l/g;s/>/_r/g;s/:/_c/g;s/;/_s/g;s/@/_a/g;s/%/_p/g;
s@\?\?/@%@g;s@/$lc*\*@:&@g;s@\*$lc*/@;&@g
s:/$lc*/:@&:g;s/\?\?'/!/g
s#:/$lc*\*[^;]*;\*$lc*/|@/$lc*/$lc*|(\"([\\\\%]$lc*.|[^\\\\%\"])*\"|'$lc*([\\\\%]$lc*.)?[^\\\\%']*'|[^'\"@;:]+)#<\5>#g
s/<>/ /g;s/!/??'/g;s@%@??/@g;s/[<>@:;]//g
s/_p/%/g;s/_a/@/g;s/_s/;/g;s/_c/:/g;s/_r/>/g;s/_l/</g;s/_b/!/g;s/_u/_/g"
যদি আপনার জিএনইউ sed
সমর্থন করার জন্য খুব পুরানো হয় -E
বা -z
আপনি প্রথম লাইনটি প্রতিস্থাপন করতে পারেন:
sed -r ":1;\$!{N;b1}