2013-06-26 4 views
1

Eclipse 플러그인 용 JAVACC를 사용하여 간단한 Verilog HDL 파서를 작성하고 있습니다.스캐너가 JAVACC에서 SPECIAL_TOKEN을 만날 때 함수를 호출하는 방법이 있습니까?

이 플러그인에서는 모든 매개 변수와 와이어가 아웃 라인보기에 등록됩니다. 이 기능은 포함 된 파일에 많은 선언이있는 경우 개요보기에서 원하는 신호를 찾기가 어렵습니다. 개요 목록이 짧아 지도록 포함 된 파일의 매개 변수 (및 기타 신호)를 하위 폴더로 수집하려고합니다.

파서는 실제로 두 패스에서 작동합니다. 즉, 모든 컴파일러 유도체가 먼저 해결되고 결과 문자열이 Verilog 파서 (JAVACC)로 전달된다는 의미입니다.

이 때문에 JAVACC 파서는 포함 된 파일의 시작 및 끝 위치를 알 수 없습니다.

이 문제를 해결하기 위해 일부 포함 관련 정보가있는 SPECIAL_TOKEN을 추가했습니다.

Lexer는 SPECIAL_TOKEN을 올바르게 감지하지만 SPECIAL_TOKEN의 전처리 본문에서 파서의 기능을 호출하는 방법을 찾지 못했습니다. (실제로 차이 클래스에 있기 때문에 합리적입니다.)

페이지의 마지막 섹션에서 설명한 해결책을 사용할 수 있다고 생각합니다 (https://javacc.java.net/doc/tokenmanager.html). 그러나 모든 토큰에 이러한 코드를 추가해야합니다. 그렇습니까? 알다시피, Verilog의 문법은 너무 복잡해서 위의 해결책을 받아 들일 수 없습니다.

이 문제를 해결하는 좋은 해결책이 있습니까?

답변

1

파서가 정적 인 경우 파서 기능을 정적으로 설정하십시오.

파서가 정적이 아닌 경우 토큰 관리자가 파서를 가리키는 포인터를 갖도록 정렬 할 수 있습니다. 파서가

VerilogParserTokenManager tokMan = new VerilogParserTokenManager(in) ; 
VerlilogParser parser = new VerlilogParser(tokMan) ; 
tokMan.myParser = parser ; 
parser.start() ; 

이 내다 토큰 관리자가 아니라 앞서 파서의 원인이 될 수 있다는 것을 명심 분석을 시작하기 전에

TOKEN_MGR_DECLS : { VerlilogParser myParser ; } 

가 그럼 그냥이 필드를 설정해야합니다 다음과 같이 포인터를 선언합니다. 따라서 토큰 관리자에서 파서를 호출 할 때는 매우주의해야합니다. C++에서 사전 전처리 행 번호와 사전 전처리 행 번호 및 파일 이름을 연관시키는 문제를 해결하는 방법은 하나에서 다른 것으로 매핑을 나타내는 테이블을 작성한 것입니다. https://code.google.com/p/the-teaching-machine-jhigraph-and-webwriter-plus-plus/source/browse/trunk/trunk/tm/src/tm/cpp/parser/cplusplus.jj에서 확인할 수 있습니다.

// Coordinates 
SourceCoords getCoords(int offset) { 
    return pc.line_map.getCoords(getToken(offset).beginLine) ; } 

line_map 테이블을 사용하여 토큰 매니저가 가득 :

파서 다음 토큰의 원래의 좌표를 알 필요가

, 그것은 다음과 같이 getCoords가 (0) 정의 호출 여기에 몇 가지 발췌 다음 코드.

SPECIAL_TOKEN : 
{ 
    // Line directives should have the form 
    // #line linenum filename 
    // or 
    // #line linenum 
    // In the latter case the previous file name is kept. 
    "#line" : LINE_DIRECTIVE 
} 

<LINE_DIRECTIVE> SPECIAL_TOKEN : 
{ 
    <LINE_NO : (["0"-"9"])+> 
    { tokenLine = matchedToken.beginLine+1 ; 
     sourceLine = Integer.parseInt (matchedToken.image.trim()); } 
| 
    <FILE_NM : "\"" (["0"-"9"])+ "\""> 
    { file = fileMap.get(new Integer(matchedToken.image.substring(1, matchedToken.image.length()-1)));} 
| 
    " " 
| 
    "\n" { pc.line_map.add (tokenLine, sourceLine, file); } : DEFAULT 
}