Javacc을 사용하여 언어 구문을 작성하는 데 새로운 경험이 있으므로 코드에서 토큰 정의를 다시 정의 할 수있는 방법을 찾아야합니다. 이 될 것입니다 무슨 예를 들어Javacc로 어휘 토큰 다시 정의
, 이것이 가능하지 않다면
REDEFINE IF FOO
는 "IF"에서
< IF: "IF" >
으로
< IF: "FOO" >
의 정의를 변경해야 라인, 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
Javacc을 사용하여 언어 구문을 작성하는 데 새로운 경험이 있으므로 코드에서 토큰 정의를 다시 정의 할 수있는 방법을 찾아야합니다. 이 될 것입니다 무슨 예를 들어Javacc로 어휘 토큰 다시 정의
, 이것이 가능하지 않다면
REDEFINE IF FOO
는 "IF"에서
< IF: "IF" >
으로
< IF: "FOO" >
의 정의를 변경해야 라인, 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
당신은 토큰의 종류 필드를 변경하는 토큰 액션으로 할 수 있다고 생각합니다.
다음과 같은 메시지가 표시됩니다. [테스트되지 않은 코드는 다음과 같습니다. 당신이 그것을 사용하는 경우,이 답변의 오류를 수정하시기 바랍니다]
해시 맵의 토큰 매니저 선언합니다.
이TOKEN_MGR_DECLS: {
public java.util.HashMap<String,Integer> keywordMap = new java.util.HashMap<String,Integer>() ;
{ keywordMap.put("IF", ...Constants.IF); }
}
은 식별자에 대한 정의를합니다.
TOKEN : { <ID : (["a"-"z","A"-"Z"])(["a"-"z","A"-"Z","0"-"9"])* >
{ if(keywordMap.containsKey(matchedToken.image)) {
matchedToken.kind = keywordMap.get(matchedToken.image) ; }
}
}
키워드에 대한 정의를 만듭니다. 이들은 ID의 정의 이후에 올 필요가있다. 실제로 이들은 종류가 창조 될 수 있도록 여기에 있습니다. 그들은 도달 할 수 없으며 경고를 유발할 수 있습니다.
TOKEN : { <IF : "A"> | ... }
당신이 정의 할 필요가 파서에서
void redefine() :
{
Token oldToken;
Token newToken;
}
{
<REDEFINE> oldToken=redefinableToken() newToken=redefinableToken()
{
if(...TokenManager.keywordMap.containsKey(oldToken.image)) {
...TokenManager.keywordMap.remove(oldToken.image) ;
...TokenManager.keywordMap.add(newToken.image, oldToken.kind) ; }
else {
report an error }
}
}
Token redefinableToken() :
{ Token t ; }
{
t=<ID> {return t ;}
| t=<IF> {return t ;}
| ...
}
파서에서 렉서의 동작을 변경하는 시도에 대해 경고에 대한 자주 묻는 질문 (4.14)를 참조하십시오 재정의. 길고도 짧다 : 미리보기를 피하십시오.
또 다른 방법은 단순히 하나의 토큰 종류가 ID
말을하고 파서에서 모든 것을 처리하는 것입니다. "키워드를 의미 론적 미리보기로 바꾸기"에 대한 FAQ 4.19를보십시오. syntaxer lookahead (FAQ 4.10)에서 파서의 의미 론적 동작이 실행되지 않기 때문에 미리보기는 문제가되지 않습니다.
답장을 보내 주셔서 감사합니다. 파서 전체에서 keywordMap을 참조 할 때 문제가 발생합니다 ( 토큰 정의). - 해결되지 않은 컴파일 문제 : keywordMap을 확인할 수 없거나 필드가 아닙니다. –
업데이트 : 나는 단지이 문제를 해결했는데, 아직 문제가있다. 곧 답장을 보내 드리겠습니다. –
이 솔루션을 약간의 미세 조정으로 잘 처리해 주셔서 대단히 감사합니다. –