javacc로 parsing에서 질문..RE -> nfa

0
points

javacc 의 parser를 아래와 같이 작성된 source를
컴파일하면 아무 문제 없이 잘됩니다. (이소스는 jstorm에서 퍼왔습니다.)

void parseOneLine():
{
    double a;
}
{
    a=expr() <EOL>      { System.out.println(a); }
  | <EOL>
  | <EOF>               { System.exit(-1); }
}

double expr():
{
    double a;
    double b;
}
{
    a=term()
    (
        "+" b=expr()    { a += b; }
    |   "-" b=expr()    { a -= b; }
    )*
                        { return a; }
}

double term():
{
    double a;
    double b;
}
{
    a=unary()
    (
        "*" b=term()    { a *= b; }
    |   "/" b=term()    { a /= b; }
    )*
                        { return a; }
}

double unary():
{
    double a;
}
{
    "-" a=element()     { return -a; }
|   a=element()         { return a; }
}

double element():
{
    Token t;
    double a;
}
{
    t=<NUMBER>          { return Double.parseDouble(t.toString()); }
|   "(" a=expr() ")"    { return a; }
}

그런데, 이 소스를 바탕으로 레귤러익스프레션->nfa로 바꾸는 parser를 만들었는데요.

수정한부분은 unary()에서 "-" a를 a "^" (참고: ^는 star를 뜻한다고하고요)로 고치고

"-"오퍼래이터없애고 토큰수정하고 등등해서 만들었는데요

일반적인 레귤러익스프레션은 잘 작동하는데 괄호가 있는 레귤러익스프레션은

작동하질않네요. 원본소스코드는 괄호가있는 계산도 잘되던데, 무엇이 문제일까요?

짐작오는데라고는 unary()부분에 순서를

{

   a=element()         { return a; }
|  a=element()"^"     { return -a; }
}

이렇게하면 괄호는 잘작동하는데 star가 작동하질 않네요 ㅠ

그래도 수정방법을 모르겠다는 .. 조금이라도 감오시면 답변좀해주십시오. 자료가 너무없네요

...

0
points

아. "^"를 앞에 위치하면
괄호와 ^가 다 작동은하는데 notation이 보기 흉해지네요...
이걸로봐서 grammar가 잘못표현된것같은데
도무지 감이 안오네요...

LOOKAHEAD(2)..?

0
points

이러면 어떤가요?

{
    LOOKAHEAD(2)
    a=element() { return a; }
  | a=element()"^" { return -a; }
} 

음..

0
points

처음에 기본적으로 LOOKAHEAD = 2로 옵션에 주고 시작하는데..

순서를 바꾸면 괄호만 잘 통과하고 ^는 파싱을하지못하네요.

물론 아직까지,
"^" a=element() { ...}
| a=element() { ... }

이렇게하면 파싱이 잘됩니다만..

원래 원본 소스가 -a 같은 형식을 파싱하는데
순서만 바꾼다고 a-를 파싱하지 못하네요 ...ㅠ

혹시나..

0
points

혹시나 해서 여쭤보는거지만..
element() 와 "^" 는 공백 문자로 분리되어 있겠지요?

...

0
points

네. 분리되어있습니다. 분리하지않아도 결과는 분리된거랑 마찬가지입니다.
...

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.