[JavaCC] Określanie dokładniej ilości wystąpień wyrażenia

0

W oficjalnym FAQ czytam:

How do I match exactly n repetitions of a regular expression?

If X is the regular expression, write
(X){n}
You can also give a lower and upper bound on the number of repetitions:
(X){l,u}

Czyli wszystko zgodnie z zasadami tworzenia wyrażeń regularnych.
Tworze więc funkcję zgodną z tym schematem, np:

void declarationPart():
{}
{
	(<NAME>){1,2}
}

lecz podczas próby skompilowania tego otrzymuję komunikat o ParseException wskazujący na to miejsce. Podobnie kiedy próbuję z
(<NAME>){1,2}
lub
((<NAME>){1,2})

Nie wiecie, czy da się w jakiś sposób osiągnąć tak trywialny cel jak określenie ilości wystąpień wyrażenia? :/

0

Czy ponizszy kod:

void declarationPart():
{}
{
        (<NAME>){1,2}
}

napisales bezposrednio w Javie? Jesli tak, to na pewno sie to nie skompiluje, bo nie jest to zgodne ze skladnia Javy. Aby skorzystac w Javie z funkcjonalnosci wyrazen regularnych, musisz uzyc odpowiedniego API - klas java.util.regex.Pattern i java.util.regex.Matcher, wzglednie metod w klasie String, ktore dzialaja 'na skroty' (uzywaja Pattern i Matcher w tle, 'odciazajac' programiste), ale nadaja sie tylko do najprostszych przypadkow.

Co do samego wyrazenia - napisz prosze co dokladnie chcessz osiagnac. Policzyc wystapienia <NAME> w jakims lancuchu znakow, czy po prostu sprawdzic czy lancuch ten zawiera podlancuch o okreslonej ilosci wystapien <NAME>? Wtedy bede w stanie podpowiedziec. Polecam tez spojrzec na API klasy Pattern i samemu troche poglowkowac: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html


P.S. 
Hej dopiero zobaczylem ze Tobie chodzi o JavaCC... niestety nie znam tego narzedzia wiec nie za bardzo moge pomoc... Tylko tyle ze Twoj regex (<NAME>){1,2} jest jak najbardziej poprawny i zmatchuje wszystkie lancuchy znakow zawierajace <NAME> lub <NAME><NAME>. Gdybys chcial zmatchowac jakikolwiek lancuch zawierajacy 1 lub 2 <NAME>, to trzeba by chyba uzyc (<NAME>.*){1,2}
0
Kordzik napisał(a)

Aby skorzystac w Javie z funkcjonalnosci wyrazen regularnych, musisz uzyc odpowiedniego API - klas java.util.regex.Pattern i java.util.regex.Matcher, wzglednie metod w klasie String, ktore dzialaja 'na skroty' (uzywaja Pattern i Matcher w tle, 'odciazajac' programiste), ale nadaja sie tylko do najprostszych przypadkow.

Co do samego wyrazenia - napisz prosze co dokladnie chcessz osiagnac. Policzyc wystapienia <NAME> w jakims lancuchu znakow, czy po prostu sprawdzic czy lancuch ten zawiera podlancuch o okreslonej ilosci wystapien <NAME>? Wtedy bede w stanie podpowiedziec. Polecam tez spojrzec na API klasy Pattern i samemu troche poglowkowac: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

> 
> P.S. 
> Hej dopiero zobaczylem ze Tobie chodzi o JavaCC... niestety nie znam tego narzedzia wiec nie za bardzo moge pomoc... Tylko tyle ze Twoj regex (<NAME>){1,2} jest jak najbardziej poprawny i zmatchuje wszystkie lancuchy znakow zawierajace <NAME> lub <NAME><NAME>. Gdybys chcial zmatchowac jakikolwiek lancuch zawierajacy 1 lub 2 <NAME>, to trzeba by chyba uzyc (<NAME>.*){1,2}


Wiem, Kordzik, klasy Pattern i Scanner to wspaniałe narzędzia, niestety w bardziej skomplikowanych sytuacjach po prostu nie wystarczają i wtedy do gry wchodzi JavaCC, dzięki której można sprawnie pisać znacznie bardziej zaawansowane reguły. Moje wyrażenie jest poprawnym wyrażeniem regularnym, ale w składni JavaCC znak "{" oznacza początek kodu napisanego w normalnej Javie, a "}" jego koniec. I niestety mimo tego, co piszą w FAQ, właśnie tak jest ten mój kod interpretowany.
0

This syntax applies only to the tokenizer, it can't be used for parsing.

Zamiast pisać "(X){3}" daj "(X)(X)(X)"

0
__krzysiek85 napisał(a)

This syntax applies only to the tokenizer, it can't be used for parsing.

Zamiast pisać "(X){3}" daj "(X)(X)(X)"

Aha :(. Gorzej, jak będzie trzeba, żeby wyrażenie powtórzyło się np. dokładnie 20 razy... Ale Tokena faktycznie da się wyspecyfikować z użyciem tej składni, więc można z tego jakoś wybrnąć. Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1