예 이렇게하는 것이 더 좋습니다. 기호 테이블이 필요합니다. 기호 표의 작업은 프로그램의 각 지점에서 사용할 수있는 식별자를 추적하는 것입니다. 일반적으로 기호 테이블에는 식별자에 대한 다른 정보 (예 : 변수 또는 함수 이름)와 유형에 대한 정보가 포함됩니다.
기호 테이블을 사용하면 구문 분석 중에 범위를 벗어나는 변수의 사용을 감지 할 수 있습니다. 예 : C와 Pascal은 식별자를 사용하기 전에 식별자를 선언해야하는 언어입니다 (예외는 일부 있음). 그러나 다른 언어 (예 : Java)는 식별자가 사용 된 후에 선언 할 수있게하며,이 경우 프로그램을 구문 분석 할 때까지 선언되지 않은 변수를 사용하는 등의 오류를 감지하지 않는 것이 가장 좋습니다. (실제로 Java에서는 식별자가 다른 파일에서 선언 될 수 있기 때문에 모든 파일이 구문 분석 될 때까지 기다려야합니다.)
변수에 대한 정보 만 기록하면되는 간단한 시나리오를 가정합니다. 타입 정보가 아니며 사용하기 전에 반드시 선언해야합니다. 그렇게하면 시작할 수 있습니다. 필자는 심볼 테이블에 함수 이름을 추가하는 것에 대해 신경 쓰지 않았습니다.
심볼 테이블이 프레임이라고하는 스택이라고 가정합니다. 각 프레임은 변경 가능한 문자열 세트입니다. (나중에 문자열에서 변경된 추가 정보로 변경할 수도 있습니다.)
void Start(): { }
{
<FUNCTION>
<IDENTIFIER>
{symttab.pushNewFrame() ;}
<LBRACKET> Parameters() <RBRACKET>
<LBRACE> Expression() <RBRACE>
{symtab.popFrame() ; }
}
void Parameters() : {}
{
(Parameter() (<COMMA> Parameter())*)?
}
void Parameter() : { Token x ; }
<OBJECT> x=<IDENTIFIER>
{ if(symtab.topFrame().contains(x.image)) reportError(...) ; }
{ symtab.topFrame().add(x.image) ; }
}
void Expression() : { }
{
Exp1() (<PLUS> Exp1())*
}
void Exp1() : { Token y ; }
{
y = <IDENTIFIER>
{ if(! symtab.topFrame().contains(y.image)) reportError(...) ; }
|
<NUMBER>
}
Reflection에 대해 묻고 싶습니까? http://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful – Aboutblank
JavaCC를 사용하여 컴파일러를 작성하는 경우 수행하려는 작업은 추적을 유지하는 기호 테이블을 유지하는 것입니다 어떤 식별자가 코드의 각 지점에서 사용될 수 있는지. 기호 표는 일반적으로 식별자에 대한 유용한 정보 (예 : 변수 대 함수)와 유형에 대한 정보도 보관합니다. –
질문을 명확히 할 수 있습니까? 마지막 문장에서 알 수있는 것은 "일치하는 토큰을 어휘 토큰으로 사용할 수 있습니까?"입니다. 하지만 그건 네가 의미하는 바가 아닌 것 같아. –