समस्या यह है कि आप केवल ब्लॉक को "छोड़ नहीं सकते"। ब्लॉक में उनके अंदर ब्लॉक की अज्ञात संख्या है, इसलिए यह जानने के लिए कि वह ब्लॉक कब पूरा हो गया है, आप नियमित भाषा का उपयोग नहीं कर सकते हैं, आपको स्टैक का उपयोग करना होगा और प्रत्येक ब्लॉक के माध्यम से स्टैक खाली होने तक चलना होगा, जिस बिंदु पर आप जानते हैं कि ब्लॉक किया गया है।
कारण आप ब्लॉक को छोड़ नहीं सकते हैं यह है कि ब्लॉक के लिए नियमित अभिव्यक्ति केवल * पहले */इसे बाद में देखे जाने वाले "या" आखिरी */बाद में देखे जाने वाले "के साथ मिलान करने में सक्षम है। या "एनएच */यह बाद में देखता है"।
अगर हम पहले "* /" टोकन हम देखते हैं के साथ जाना है, हम कोड की तरह
/*
/*
*/
the compiler matched /* with */ and this line and the next one will confuse it.
*/
अगर हम पिछले "* /" टोकन हम देखते हैं के साथ जाने के लिए हो सकता है, हम कोड है जहां संकलक फ़ाइल में पहली टिप्पणी और फ़ाइल के अंत की अंतिम टिप्पणी के बीच चीजों को छोड़ देगा। इस मामले में, निम्न कोड को खाली स्ट्रिंग के रूप में पार्स किया जाएगा।
/*
/* hello, world! */
*/
int main(int argc, char ** argv) {
return 0;
}
/* end of file */
हम छोड़ n सभी टिप्पणियों के लिए मजबूर कर गहराई की सही संख्या के लिए बिना भीतरी ब्लॉक के तीसरे विकल्प के साथ नहीं जा सकते, अन्यथा यह आंतरिक टिप्पणी नहीं मिल रहा और उलझन में मिल जाएगा।
दरअसल, स्पष्ट रूप से यह कहने का एक चौथा विकल्प है कि एक टिप्पणी एक टिप्पणी हो सकती है, 2-स्कोप टिप्पणी, 3-स्कोप टिप्पणी आदि; लेकिन ऐसा करना एक बदसूरत है, और गहराई के प्रत्येक स्तर की एक लंबी अवधि की अभिव्यक्ति की आवश्यकता होती है, और यह दृष्टिकोण एक विशिष्ट गहराई को टिप्पणियों को सीमित करता है जो कुछ लोगों को फिट कर सकता है, और दूसरों के अनुरूप नहीं हो सकता है: क्या होगा यदि आप उस कोड को टिप्पणी करते हैं जिस पर टिप्पणी की गई है 3 बार?
<?php
function stripComments($code) {
$stack = array();
$codeOut = '';
$stringStream = fopen('php://memory', 'r+');
fwrite($stringStream, $code);
rewind($stringStream);
while (!feof($stringStream)) {
$ch = fgetc($stringStream);
$nextChar = fgetc($stringStream);
if ($nextChar === false) {
break;
}
if ($ch == '/' && $nextChar == '*') {
array_push($stack, '/*');
} else if ($ch == '*' && $nextChar == '/') {
if (count($stack) > 0) {
array_pop($stack);
} else {
die('cannot pop from empty stack');
}
} else {
if (count($stack) == 0) {
$codeOut .= $ch;
fseek($stringStream, -1, SEEK_CUR);
}
}
$prevChar = $ch;
}
return $codeOut;
};
?>
कौन क्या सी वर्तमान में उपयोग करता है की तुलना में थोड़ा अधिक जटिल है:
function stripComments($code) {
return preg_replace('/\/\*[^\*\/]*\*\//', '', $code);
}
यह विचार /**/
पर ध्यान नहीं देता
सामान्य समाधान एक पूर्व पूर्वप्रक्रमक जैसे के साथ लागू किया जा सकता कोट्स के अंदर ब्लॉक, थोड़ा और जटिल स्टैक जो "/ *" स्कोप और "\" "के बीच अंतर कर सकता है"
टिप्पणियों के अंदर टिप्पणी करने का लाभ यह है कि आप उन ब्लॉकों पर टिप्पणी कर सकते हैं जिनमें टिप्पणियों को मैन्युअल रूप से अलग किए बिना टिप्पणियां शामिल हैं, जो विशेष रूप से उन सभी ब्लॉकों के लिए निराशाजनक है जो प्रत्येक पंक्ति पर टिप्पणी करते हैं।
सारांश: यह किया जा सकता है, लेकिन अधिकांश भाषाएं टिप्पणियों का इलाज नहीं करना चाहती हैं जैसे कि वे अपने स्वयं के क्षेत्र थे, क्योंकि यह पार्स करने के लिए और अधिक प्रयास करता है।
"तथ्य"? वास्तव में? –