/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
java.util.regex og rekursion
Fra : Christoffer Magnusse~


Dato : 10-10-02 20:24

Er der nogle der har erfaringer med java.util.regex?

Mit problem er flg.:

Jeg har et streng der indeholder elementer af forskellig type. Disse
type kan vaere rekursive, f.eks.:

expr ::= expr + expr | int

det vil jo sige at strengen baade kan se ud som 2+2 eller 2+2+2+2 ...

Hvordan faar jeg matchet dette i java?

Med venlig hilsen
Christoffer Magnussen


 
 
Jonathan Stein (10-10-2002)
Kommentar
Fra : Jonathan Stein


Dato : 10-10-02 21:25

Christoffer Magnussen wrote:

> Jeg har et streng der indeholder elementer af forskellig type. Disse
> type kan vaere rekursive, f.eks.:

"+" (plus) matcher foranstående udtryk én eller flere gange. F.eks.:
(abc)+
- matcher "abc", "abcabc" og "abcabcabc".
"*" (stjerne) matcher nul eller flere gange. - Med en operator imellem,
skal du muligvis bruge noget i retning af:
abc(\+abc)*
- som vil matche:
"abc", "abc+abc" og "abc+abc+abc" (men ikke "abcabc").

M.v.h.

Jonathan

--
Nyt alternativ til egen server: JSP Enterprise hotel med adgang til
Enterprise Java Beans, egen Java Virtual Machine og egen IP-adresse
(giver mulighed for eget SSL-certifikat).
http://www.jsp-hotel.dk/



Thorbjoern Ravn Ande~ (11-10-2002)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-10-02 01:02

Christoffer Magnussen <stoffer@daimi.au.dk> writes:

> Jeg har et streng der indeholder elementer af forskellig type. Disse
> type kan vaere rekursive, f.eks.:
>
> expr ::= expr + expr | int
>
> det vil jo sige at strengen baade kan se ud som 2+2 eller 2+2+2+2 ...
>
> Hvordan faar jeg matchet dette i java?

Hvis typen kan være rekursiv og du har flere definitioner, kan du
formentlig ikke lave det fornuftigt med regulære udtryk. Du antyder
ovenfor at du skal lave noget der kan regne udtryk ud - det kræver
normalt mere end regulære udtryk kan klare.

I "gamle dage" ville man bruge flex/bison i C til at generere
skeletkoden med - konceptet er helt sikkert porteret til Java, men
spørgsmålet er hvad opgaven lægger op til?

--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Stoffer (11-10-2002)
Kommentar
Fra : Stoffer


Dato : 11-10-02 11:54

Thorbjoern Ravn Andersen wrote:
> Christoffer Magnussen <stoffer@daimi.au.dk> writes:
>
>
>>Jeg har et streng der indeholder elementer af forskellig type. Disse
>>type kan vaere rekursive, f.eks.:
>>
>>expr ::= expr + expr | int
>>
>>det vil jo sige at strengen baade kan se ud som 2+2 eller 2+2+2+2 ...
>>
>>Hvordan faar jeg matchet dette i java?
>
>
> Hvis typen kan være rekursiv og du har flere definitioner, kan du
> formentlig ikke lave det fornuftigt med regulære udtryk. Du antyder
> ovenfor at du skal lave noget der kan regne udtryk ud - det kræver
> normalt mere end regulære udtryk kan klare.
>
> I "gamle dage" ville man bruge flex/bison i C til at generere
> skeletkoden med - konceptet er helt sikkert porteret til Java, men
> spørgsmålet er hvad opgaven lægger op til?
>
Jeg er ikke helt sikker på, hvad du mener med flere definitioner.
Der skal ikke være nogen form for gensidig rekursivitet. Udtrykket kunne
skrives som:

expr::= int | expr + expr | expr - expr | expr / expr | expr * expr
hvor int, +, -, / og * er terminaler og expr er den eneste nonterminal

Jeg har forsøgt mig en lille smule med en StringTokenizer der kan dele
udtrykket op, men kan ikke helt gennemskue hvordan jeg kan få det til at
virke.

mvh
Christoffer


Thorbjoern Ravn Ande~ (11-10-2002)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-10-02 12:46

Stoffer <stoffer@daimi.au.dk> writes:

> expr::= int | expr + expr | expr - expr | expr / expr | expr * expr
> hvor int, +, -, / og * er terminaler og expr er den eneste
> nonterminal

Det lyder jo simpelt. Må man spørge hvad du skal bruge det til?

> Jeg har forsøgt mig en lille smule med en StringTokenizer der kan dele
> udtrykket op, men kan ikke helt gennemskue hvordan jeg kan få det til
> at virke.

Hvad er det du skal?

--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Stoffer (11-10-2002)
Kommentar
Fra : Stoffer


Dato : 11-10-02 13:01

Thorbjoern Ravn Andersen wrote:
> Stoffer <stoffer@daimi.au.dk> writes:
>
>
>>expr::= int | expr + expr | expr - expr | expr / expr | expr * expr
>>hvor int, +, -, / og * er terminaler og expr er den eneste
>>nonterminal
>
>
> Det lyder jo simpelt. Må man spørge hvad du skal bruge det til?
>
>
>>Jeg har forsøgt mig en lille smule med en StringTokenizer der kan dele
>>udtrykket op, men kan ikke helt gennemskue hvordan jeg kan få det til
>>at virke.
>
>
> Hvad er det du skal?
>
Ja, det må du da. Jeg skal finde ud af om en string er en
'well-formed-formula' altså et gyldigt logisk udtryk. Herefter er det
meningen at udtrykkes skal evalueres, og evt at der skal laves
sandhedstabeller.

Jeg har altså flg. udtryk:

wff ::= CHAR | NOT wff | wff AND wff |
wff OR wff | wff -> wff | wff <-> wff

hvor CHAR (som jo bliver til en boolean), NOT, AND, OR, -> og <-> er
terminaler.

Men før jeg kan evaluere udtrykket ville det jo være rart at få
bekræftet om det er en wff, det er tale om

/stoffer


Thorbjoern Ravn Ande~ (11-10-2002)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-10-02 13:05

Stoffer <stoffer@daimi.au.dk> writes:

> Jeg har altså flg. udtryk:
>
> wff ::= CHAR | NOT wff | wff AND wff |
> wff OR wff | wff -> wff | wff <-> wff

Den passer dårligt til regulære udtryk.

> Men før jeg kan evaluere udtrykket ville det jo være rart at få
> bekræftet om det er en wff, det er tale om

Skriv en parser til at lave det om til tokenformat, som du så
evaluerer. Parseren skal så fejlmelde hvis det ikke er velformet.

Af denne størrelse, er det til at overskue at lave en LL(1) parser.
--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Ulrik Magnusson (11-10-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 11-10-02 15:55



Thorbjoern Ravn Andersen wrote:

> Stoffer <stoffer@daimi.au.dk> writes:
>
> > Jeg har altså flg. udtryk:
> >
> > wff ::= CHAR | NOT wff | wff AND wff |
> > wff OR wff | wff -> wff | wff <-> wff
>
> Den passer dårligt til regulære udtryk.

Men det kan vel godt lade sig gøre, hvis vi fjerner venstrerekursion:

wff ::= CHAR
| NOT wff
| CHAR AND wff
| CHAR OR wff
| CHAR IMPL wff
| CHAR BIIMPL wff

Så kan det vel skrives som:

(CHAR
((AND CHAR)* | (OR CHAR)* | (-> CHAR)* | (<-> CHAR)* )*
| NOT
(CHAR
((AND CHAR)* | (OR CHAR)* | (-> CHAR)* | (<-> CHAR)* )*

Er det ikke korrekt?

Ulrik Magnusson

PS: Jeg ville nok også lave en "recursive descent parser" - om ikke
andet er muligheden for ordentlige fejlmeldinger noget bedre:


Token token; // class Token{ int type, offset; String value; }
Lexer lexer; // interface Lexer{ Token nextToken(); }
Token lastSuccessToken;

boolean matchWFF( )
{
boolean ch = matchTokenType( CHAR );
if( !ch ) // NOT wff
{
if( matchTokenType( NOT) )
{
return matchWFF();
}
return false;
}
else //CHAR ..
{
if( matchTokenType(AND) ||
matchTokenType(OR) ||
matchTokenType(IMPL) ||
matchTokenType(BIIMPL) ||
)
{
return matchWff();
}
}
return true;// en enkelt CHAR
}

boolean matchTokenType( int type )
{
if( token != null && token.type == type )
{
lastSuccessToken = token;
token = lexer.nextToken();
return true;
}
return false;
}

void match( String str )
{
lexer = new Lexer( str );
token = lexer.nextToken();
if( matchWFF() )
{
// ok
}
else
{
// forkert syntaks ca. ved lastSuccessToken
}
}

Sikke da et langt PS..


Niels Ull Harremoës (15-10-2002)
Kommentar
Fra : Niels Ull Harremoës


Dato : 15-10-02 18:06


"Thorbjoern Ravn Andersen" <thunderbear@bigfoot.com> skrev i en meddelelse
news:kk65w9n8rc.fsf@mimer.null.dk...
> Christoffer Magnussen <stoffer@daimi.au.dk> writes:
>
> > Jeg har et streng der indeholder elementer af forskellig type. Disse
> > type kan vaere rekursive, f.eks.:
> >
> > expr ::= expr + expr | int
> >
> > det vil jo sige at strengen baade kan se ud som 2+2 eller 2+2+2+2 ...
> >
> > Hvordan faar jeg matchet dette i java?
>
> Hvis typen kan være rekursiv og du har flere definitioner, kan du
> formentlig ikke lave det fornuftigt med regulære udtryk. Du antyder
> ovenfor at du skal lave noget der kan regne udtryk ud - det kræver
> normalt mere end regulære udtryk kan klare.
>
> I "gamle dage" ville man bruge flex/bison i C til at generere
> skeletkoden med - konceptet er helt sikkert porteret til Java, men
> spørgsmålet er hvad opgaven lægger op til?

Og i dag vil man bruge JavaCC - se evt
http://www.webgain.com/products/java_cc
Og ja, den er gratis.

Men det kan da godt være det er lidt overkill til opgaven.

>
> --
> Thorbjørn Ravn Andersen
> http://homepage.mac.com/ravn

Niels Ull Harremoës



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste