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