2009-12-09 4 views
0

모든 예제에서는 lex &을 파싱하여 파일을 읽습니다.파일이 아닌 함수 매개 변수에서 입력 받기

매개 변수로 문자열 (char *, 나는 C 코드를 생성)을 취하고 그에 따라 작동하는 함수가 있어야합니다.

어떻게하면됩니까? 나는 문자열을 스트림에 쓰고 그 문자열을 렉서에 넘겨 줄 것을 생각했지만 제대로 된 느낌이 들지 않습니다. 더 좋은 방법이 있습니까?

미리 감사드립니다.

답변

2

antlr3NewAsciiStringInPlaceStream 방법을 사용해야합니다.

Antlr 버전을 사용하고 계시므로 Antlr v3을 사용하겠습니다.

이 메서드에 대한 입력은 구문 분석 할 문자열이며 길이이며 마지막 입력에 NULL을 사용할 수 있습니다.

그러면 파일을 구문 분석하는 데 사용할 antlr3AsciiFileStreamNew과 비슷한 입력 스트림이 생성됩니다.

입력에 스트림을 쓰는 것에 대해 언급했음을 확인했습니다. C++을 사용할 수 있다면 아마도 가장 좋은 방법 일 것입니다.

std::istringstream issInput(std::cin); // make this an ifstream if you want to parse a file 
Lexer   oLexer(issInput); 
Parser   oParser(oLexer); 

oFactory("CommonASTWithHiddenTokens",&antlr::CommonASTWithHiddenTokens::factory); 
    antlr::ASTFactory oFactory; 
oParser.initializeASTFactory(oFactory); 
oParser.setASTFactory(&oFactory); 

oParser.main(); 
antlr::RefAST ast = oParser.getAST(); 
if (ast) 
{ 
    TreeWalker oTreeWalker; 
    oTreeWalker.main(ast, rPCode); 
} 
+0

예, V3. 불행히도, 나는 가장 낮은 공통 분모를 맞추어야하므로 C++가 아닌 C 여야합니다. 할 수 있으면 char *를 전달하지만 스트림이어야한다고 생각합니다. 그냥 지저분 해 보이는 것 같습니다 ... 예를 들어 주셔서 감사합니다. – Mawg

+0

IF C가 내 솔루션에서 보여준'antlr3NewAsciiStringInPlaceStream'을 사용하는 것이 해결책입니다. 하나 만들어서 렉서와 완료에 전달하십시오. 그것은 더 간단 할 수 없었다 :) – chollida

0

나는 그것을 스트림에 공급해야한다고 생각합니다. 원하면 표준 입력으로 먹일 수 있습니다. 그렇게하면 코드가 파일에서 문자열을 읽는 것과 크게 다를 수 없습니다.

+0

나는 우리가 같은 시간에 그것을 먹이 수 있습니다 누가 예측할 수있는 표준 입력에 공급하는 것은 위험 할 수 있다는 생각 :

이것이 내가 일반적으로 사용하는 베어 본 코드입니다. 위에서 말한 것처럼 차라리 char *를 전달하지만 스트림에 대한 쉬운 대안을 볼 수 없습니다. - – Mawg