Autor Wątek: Rozpoznawanie komentarzy  (Przeczytany 1972 razy)

Offline mykhaylo

  • Użytkownik
    • Wings of Fury 2

# Marzec 30, 2009, 00:01:36
Witam,
        chciałbym rozpoznawać komentarze w kodzie JavaScript. Komentarze są w stylu tych, które w C#. Na początku chciałbym rozpoznawać komentarze do funkcji. Mały przykład:
Kod: (javascript) [Zaznacz]
     <script language="javascript" type="text/javascript">
       
        /// <summary> Wypisuje argumenty w nowej linii </summary>
        /// <param name="a">1 argument</param>
        /// <param name="b">2 argument</param>
        /// <param name="c">3 argument</param>
        /// <returns>Cos tam zwraca</returns>
        function WriteLine(a, b, c) {
            var newLine = "<br></br>";
            document.write( a + " "+ b + " " + c + newLine);
            return newLine;
        }
    </script>
Tak naprawdę komentarz ma wartości zapisane w postaci Xml. Ale jak to rozpoznać w pliku ?
Czego użyć ? Może wyrażeń regularnych ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

poopa

  • Gość
# Marzec 30, 2009, 00:18:55
Lecisz znak po znaku az napotkasz '/'
sprawdasz czy nastepny to '/' jesli tak, to czytasz (badz szukasz innych znakow w tym fragmencie) az do eol czyli w najprostszym przypadku '\n'...

Edit:
Siedze w tym tera to uklecilem ci na szybko, jak to zrobic w C na pliku UTF-8
Kod: (c) [Zaznacz]
FILE* f = 0;
char buffer[bufferSize];
memset(buffer, 0 , bufferSize);
char text[textSize];
memset(text, 0 , textSize);

f = fopen("Test2.v", "r+");
if(f==0)
{
  puts("File Not Found");
  return 1;
}
int charsRead = fread(text, sizeof(char), textSize, f);

int i;
for(i = charsRead; i < textSize && text[i] != 0; i++)
  text[i] = 0;

fclose(f);

for(i = 0; i < textSize && text[i] != 0; i++)
  if(memcpy(text[i],"//", 2)
  {
    int i2 = 0;
    for(i+=2; i < textSize && text[i] != 0 && 0==memcmp(text[i], "\n", 1);)
    {
      buffer[i2] = text[i];
      i++;
      i2++;
    }
  }

« Ostatnia zmiana: Marzec 30, 2009, 00:38:14 wysłana przez poopa »

Offline Liosan

  • Redaktor

# Marzec 30, 2009, 00:36:21
Ja bym faktycznie użył wyrażeń regularnych, jeśli nie jest to duży problem; jeśli jest, to zrób tak jak radzi poopa, tyle że musisz uważać na cudzysłowy itp. Potem możesz przelecieć jakimkolwiek parserem XML i spokojnie zbudować sobie drzewko.

Liosan

Offline Xion

  • Moderator
    • xion.log

# Marzec 30, 2009, 02:02:19
W ostateczności możesz sobie napisać kawałek tokenizera :) Tak naprawdę jedyne, co cię tu interesuje, to napisy (ciągi w cudzysłowach) i same komentarze. Musisz uwzględnić stringi, bo inaczej coś w stylu:
string s = "// ble
// bleeee
";
byłoby wykrywane jako komentarz w kodzie.

poopa

  • Gość
# Marzec 30, 2009, 02:20:34
Ha, no tak, zapomnialem...
Sam narazie sobie odpuscilem stringi w parserze.

Offline mykhaylo

  • Użytkownik
    • Wings of Fury 2

# Marzec 30, 2009, 16:54:21
Stworzyłem następujące wyrażenie regularne:
Kod: (javascript) [Zaznacz]
((///[\s]*[^\n]*)[\s]+)+function([\s]+)([_a-zA-Z][_a-zA-Z0-9]+)\((([\s]*[_a-zA-Z]([_a-zA-Z0-9]?)+[\s]*),)*([\s]*[_a-zA-Z]([_a-zA-Z0-9]?)+[\s]*)\)Sprawdziłem je na takim przykładzie:
Kod: (javascript) [Zaznacz]
    <script language="javascript" type="text/javascript">
       
        ///    <summary> Wypisuje argumenty w nowej linii </summary>
/// <param name="a">1 argument</param>
        /// <param name="bbb">2 argument</param>
        /// <param name="_c">3 argument</param>
        /// <returns>Cos tam zwraca</returns>

         function WriteLine(  a, bbb, _c) {
            var newLine = "<br></br>";
            document.write( a + " "+ b + " " + c + newLine);
            return newLine;
        }

///<summary>Sumuje liczby</summary>
        /// <param name="x">1 argument</param>
        /// <param name="y">2 argument</param>
        /// <returns>Suma liczb</returns>
        function add(x , y) {
            return x + y;
        }
    </script>
Kod:
Kod: (csharp) [Zaznacz]
            const string regularExp = @"((///[\s]*[^\n]*)[\s]+)+function([\s]+)([_a-zA-Z][_a-zA-Z0-9]+)\((([\s]*[_a-zA-Z]([_a-zA-Z0-9]?)+[\s]*),)*([\s]*[_a-zA-Z]([_a-zA-Z0-9]?)+[\s]*)\)";
            const string fileName = @"test.txt";
            string text = File.ReadAllText(fileName);
            Regex regex = new Regex(regularExp, RegexOptions.Compiled);
            Match match;
            for (match = regex.Match(text); match.Success; match = match.NextMatch())
            {
                Console.WriteLine(match.Value);
                Console.WriteLine(Environment.NewLine + "------------" + Environment.NewLine);
            }
Wynik jest oczywisty  ;)
Postaram się uprościć to wyrażenie. Może macie jakieś lepsze pomysły co do wyrażenia regularnego ?
Może znajdziecie jakiś kontrprzykład.
« Ostatnia zmiana: Marzec 30, 2009, 17:05:00 wysłana przez mykhaylo »

Offline mykhaylo

  • Użytkownik
    • Wings of Fury 2

# Kwiecień 01, 2009, 04:19:17
Ostateczna postać wyrażenia regularnego, które rozpoznaje komentarz w stylu C# oraz połączoną z nim metodę w JavaScript. Zakładam że metoda jest poprawnie zdefiniowana:
Kod: (javascript) [Zaznacz]
(///[^\n]*\n\s*)*function\s+(\w+)\((\s*\w*\s*,?)*\)
Jeśli będziecie mieli jakieś uwagi lub propozycje uproszczenia - proszę pisać  ;)
« Ostatnia zmiana: Kwiecień 01, 2009, 15:57:18 wysłana przez mykhaylo »