javacc로 parsing에서 질문..RE -> nfa
글쓴이: leesort / 작성시간: 금, 2005/11/25 - 4:25오후
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가 작동하질 않네요 ㅠ
그래도 수정방법을 모르겠다는 .. 조금이라도 감오시면 답변좀해주십시오. 자료가 너무없네요
Forums:
...
아. "^"를 앞에 위치하면
괄호와 ^가 다 작동은하는데 notation이 보기 흉해지네요...
이걸로봐서 grammar가 잘못표현된것같은데
도무지 감이 안오네요...
------------------------------------------
------------사진은 제가 아님----------------
------------------------------------------
LOOKAHEAD(2)..?
이러면 어떤가요?
음..
처음에 기본적으로 LOOKAHEAD = 2로 옵션에 주고 시작하는데..
순서를 바꾸면 괄호만 잘 통과하고 ^는 파싱을하지못하네요.
물론 아직까지,
"^" a=element() { ...}
| a=element() { ... }
이렇게하면 파싱이 잘됩니다만..
원래 원본 소스가 -a 같은 형식을 파싱하는데
순서만 바꾼다고 a-를 파싱하지 못하네요 ...ㅠ
------------------------------------------
------------사진은 제가 아님----------------
------------------------------------------
혹시나..
혹시나 해서 여쭤보는거지만..
element() 와 "^" 는 공백 문자로 분리되어 있겠지요?
...
네. 분리되어있습니다. 분리하지않아도 결과는 분리된거랑 마찬가지입니다.
...
------------------------------------------
------------사진은 제가 아님----------------
------------------------------------------
댓글 달기