2013-07-12 4 views
0

JavaCC에서 "Java에서 작성한"그림 스크립트 "프로그램을위한 구문 분석기 문법을 함께 사용했습니다. 이 프로그램은 일련의 스크립팅 된 명령을 사용하며 대부분 java.awt.Graphics 메서드 호출에 바로 매핑되어 직접 처리되며 이미지를 파일로 출력합니다. 더 복잡한 구조 (예 : 루핑 또는 함수)를 추가하기를 원하기 때문에 JavaCC를 사용하여 파서를 작성합니다.
지금은 AST로 입력을 작성하는 데 JJTree를 사용하고 있습니다. 어쨌든, JavaCC (JJTree는 .jjt 파일에서 OK입니다.) 경고 메시지가 나타납니다.
경고 : 320 번 행의 9 번째 줄에있는 (...) 구성을 선택하십시오. 구문 중 공통적 인 접두어가 하나 있는데 그 중 하나는 "+"
중첩 확장을 위해 2 이상의 미리보기를 사용하는 것을 고려하십시오. * '(I는 별 연산자를 대체 this 건너 않았지만
JavaCC : 선택 확장에서 선택 충돌

(
    MulTerm() 
    (//line 320 in the file, column 9 starts at open parens 
     "+" 
     MulTerm() 
     {jjtThis.setName("+");} 
    | 
     "-" 
     MulTerm() 
     {jjtThis.setName("-");} 
    )* 
)#Plus(>1) 

마지막으로, : 소스 문법 "PicParse.jjt"에
때문에, 나는이 해당 파일의 잘못된 구조라고 생각 ')와 물음표 연산자 ('? ')는 경고를 제거하지 못했습니다.
궁극적으로,이 규칙 ("AddTerm()")과 동일하게이 생산 규칙을 ​​사용하여 어느 선택 사항과도 일치하는 연산자를 유지할 수 있습니다. 각 노드를 나타내는 노드 유형 하나만 있으면 더하기와 빼기를 구별 할 수 있습니다.

답변

1

수정 됨! 문제는 결국 내 첨가제 관점에서 아니었지만, 내 단항 규칙 :

(
    <OPAR> Expr() <CPAR> 
| 
    ((t=<PLUS> 
    | t=<MINUS>) Expr()) #Unary 
| 
    Integer() 
| 
    Float() 
| 
    Double() 
) 
{ if(t != null) jjtThis.setName(t.image); } 

두 번째 선택에 의한 재귀 (EXPR() -> AddTerm() -> MulTerm() -> 단항() -> Expr()) 경고 뒤에있었습니다. 두 번째 선택을 별도의 생산 규칙으로 이동하여 단항으로 다시 돌아가서 해결했습니다.

void PrimaryExpr() #PrimaryExpr(>1) : 
{ Token t=null; } 
{ 
    t=<PLUS> 
    Unary() 
    {if(t != null) jjtThis.setName(t.image);} 
| 
    t=<MINUS> 
    Unary() 
    {if(t != null) jjtThis.setName(t.image);} 
} 
+0

단 하나의 제안 : 단항 및 PrimaryExpr에서 이름을 전환하십시오. 또한 고정 된 문법에서 -a/b는 - (a/b)가 아닌 (-a)/b로 구문 분석됩니다. 이것은 프로그래밍 언어에서 상당히 일반적이지만 사용자가 기대하는 것은 아닙니다. –