2017-03-10 1 views
0

프로그래밍 언어에 대해 javacc를 사용하여 파서 및 스캐너에서 작업하고 있습니다. 지금 나는 변수에 값을 할당하는 것을 확립하려고 노력 중이다. 그래서 같은 새로운 변수를 만들 때 :해시 테이블에서 메소드를 호출하는 구문 분석기의 토큰 비교

hello = 5 

5의 값이 해시 테이블에 저장하고, 그 완벽하게 잘 작동한다. 함수를 사용하여 변수와 그 값을 가져 와서 테이블에 넣습니다. 내가 안녕하세요 이미 해시 테이블에 존재하는지 먼저 확인하는 다른 방법을 사용하십시오

hello = 5 
bye = hello 

:

그러나 나는 기존의 다른 변수에 변수를 할당 할 때. 만약에 bye가 5의 값을 할당 받으면, 5의 값이 할당되고 그렇지 않으면 오류 메시지가 출력됩니다. 내 .jj 파일 에

나는 첫 번째 경우에 다음과 같은 코드가 있습니다

void Assign() : { Token var; int value;} 
{ 
    var = <TK_ID> 
    <TK_EQ> 
    value = Exp() 

    { 
     TableVariables.assignValue(var,value); 
    } 
} 

TK_ID 변수가

TK_EQ 주어진 어떤 이름에 대한 토큰은 대한 =

토큰입니다

Exp()는 모든 종류의 수치 식을 값으로 허용하는 메서드입니다.

나는 무엇을하고 싶은지 모릅니다. 다음 : 나는이 일을 시도했지만 작동하지 않았다

public static void assignID(Token id, Token id2) { 

     if(table.containsKey(id2.image)) { 
      table.put(id.image, (Integer)table.get(id2.image)); 
     } 
     else { 
      System.out.println("Error " + id2.image + " does not exist"); 
     } 
    } 

: 같은 것을 assignID

public static void assignValue(Token id, int value) { 
     table.put(id.image, value); 
    } 

와 보이는 :

if (var = value) 
     TableVariables.assignValue(var,value); 
    else if (var = var2) 
     TableVariables.assignID(var,var2); 

이 assignValue의 모습입니다

void Assign() : { Token var; Token var2; int value;} 
{ 
    var = <TK_ID> 
    <TK_EQ> 
    value = Exp() 

    { 
     TableVariables.assignValue(var,value); 
    } 
    | 
    var = <TK_ID> 
    <TK_EQ> 
    var2 = <TK_ID> 

    { 
     TableVariables.assignID(var,var2); 
    } 
} 

도움이 될 것입니다. 감사, 감사!

+0

를하신대로, 당신 동일한 패스에서 구문 분석하고 평가하는 것은 좋은 생각이 아님을 알 수 있습니다. 그 이유는 루프를 한 번 파싱하고 싶지만 여러 번 실행해야하기 때문입니다. 서브 루틴을 지원하려는 경우에도 이와 비슷한 추론을합니다. 일종의 중간 코드를 생성하는 파싱 패스 (parsing pass)를 갖는 것이 바람직하며, 그 중간 코드를 해석 (즉, 실행)하는 해석 패스를 갖는 것이 더 나을 것이다. 중간 코드의 일반적인 선택은 가상 머신을위한 추상 구문 트리와 기계 코드입니다. –

답변

1

정말 두 가지 경우가 있다고 생각하지 않습니다. 귀하의 언어가 대부분의 언어와 같은 경우, 표현의 한 종류는 변수입니다. 나는. 처럼 Exp 비 터미널이 보일 것입니다 :

int Exp() :{ 
    Token t; 
    int value;} 
{ 
    t = <TK_ID> 
    { 
     Integer v = TableVariables.getValue(t.image) ; 
     if(v == null) { 
      reportError("Uninitialized variable "+ t.image) ; 
      return 0 ; 
     else { 
      return v.intValue() ; } 
    } 
| 
    t = <TK_INT_LITERAL> 
    { return Integer.parseInt(t.image, 10) ; } 
| 
    ... 
} 

그런 다음 할당 문은 하나의 사례로 두 가지 경우 모두를 처리 할 수있는 당신이 미래의 어느 시점에서 루프를 지원하려는 경우

void Assign() : { Token var; int value;} 
{ 
    var = <TK_ID> 
    <TK_EQ> 
    value = Exp() 

    { 
     TableVariables.assignValue(var,value); 
    } 
}