모든 예제에서는 lex &을 파싱하여 파일을 읽습니다.파일이 아닌 함수 매개 변수에서 입력 받기
매개 변수로 문자열 (char *, 나는 C 코드를 생성)을 취하고 그에 따라 작동하는 함수가 있어야합니다.
어떻게하면됩니까? 나는 문자열을 스트림에 쓰고 그 문자열을 렉서에 넘겨 줄 것을 생각했지만 제대로 된 느낌이 들지 않습니다. 더 좋은 방법이 있습니까?
미리 감사드립니다.
모든 예제에서는 lex &을 파싱하여 파일을 읽습니다.파일이 아닌 함수 매개 변수에서 입력 받기
매개 변수로 문자열 (char *, 나는 C 코드를 생성)을 취하고 그에 따라 작동하는 함수가 있어야합니다.
어떻게하면됩니까? 나는 문자열을 스트림에 쓰고 그 문자열을 렉서에 넘겨 줄 것을 생각했지만 제대로 된 느낌이 들지 않습니다. 더 좋은 방법이 있습니까?
미리 감사드립니다.
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);
}
나는 그것을 스트림에 공급해야한다고 생각합니다. 원하면 표준 입력으로 먹일 수 있습니다. 그렇게하면 코드가 파일에서 문자열을 읽는 것과 크게 다를 수 없습니다.
나는 우리가 같은 시간에 그것을 먹이 수 있습니다 누가 예측할 수있는 표준 입력에 공급하는 것은 위험 할 수 있다는 생각 :
는이것이 내가 일반적으로 사용하는 베어 본 코드입니다. 위에서 말한 것처럼 차라리 char *를 전달하지만 스트림에 대한 쉬운 대안을 볼 수 없습니다. - – Mawg
예, V3. 불행히도, 나는 가장 낮은 공통 분모를 맞추어야하므로 C++가 아닌 C 여야합니다. 할 수 있으면 char *를 전달하지만 스트림이어야한다고 생각합니다. 그냥 지저분 해 보이는 것 같습니다 ... 예를 들어 주셔서 감사합니다. – Mawg
IF C가 내 솔루션에서 보여준'antlr3NewAsciiStringInPlaceStream'을 사용하는 것이 해결책입니다. 하나 만들어서 렉서와 완료에 전달하십시오. 그것은 더 간단 할 수 없었다 :) – chollida