JavaScript 소스 파일을 구문 분석하고, 사실을 추출하고, 코드의 일부를 삽입/대체해야하는 프로그램을 작성하고 있습니다. 내가해야 할 것 사물의 종류의 간단한 설명이 코드 주어진다 :ANTLR을 사용하여 소스 코드를 분석하고 수정합니다. 내가 잘못하고있는거야?
foo(['a', 'b', 'c']);
추출 'a'
, 'b'
및 'c'
과 같은 코드를 다시 작성 : 내가 사용하고
foo('bar', [0, 1, 2]);
내 구문 분석을위한 ANTLR, C# 3 코드 생성. 다른 누군가는 이미 자바 스크립트 문법에 기여했습니다. 소스 코드의 파싱이 진행 중입니다.
내가 겪고있는 문제는 실제로 소스 파일을 올바르게 분석하고 수정하는 방법을 알아내는 것입니다. 실제로 문제를 해결하려고 시도하는 각각의 접근 방식은 막 다른 길로 인도합니다. 내가 도울 수 있지만 그 의도대로 도구를 사용하지 않거나 AST를 다루는 데있어 너무 초보자라고 생각하지 않습니다.
첫 번째 방법은 TokenRewriteStream
을 사용하여 구문 분석하고 내가 관심있는 규칙의 부분 방법을 구현하는 것입니다.이 방법이 토큰 스트림을 매우 쉽게 수정할 수있는 것으로 보이지만 분석을위한 컨텍스트 정보가 충분하지 않습니다. 내가 접근 할 수있는 것은 코드의 전체 구조에 대해 충분히 말해주지 않는 토큰의 플랫 스트림 인 것 같습니다.
a.b.foo();
이 좀 더 정교한 코드 분석을 할 수 있도록하기 위해, 내 두 번째 방법 : 예를 들어, 단순히 그 것 또한 거짓 일치하기 때문에 작동하지 않을 첫 번째 토큰에서 찾고 foo
함수가 호출되고 있는지 여부를 감지하는 더 많은 트리를 만들기 위해 다시 쓰기 규칙으로 문법을 수정하는 것이 었습니다. 이제 첫 번째 샘플 코드 블록은 다음을 생성합니다.
Program CallExpression Identifier('foo') ArgumentList ArrayLiteral StringLiteral('a') StringLiteral('b') StringLiteral('c')
코드를 분석하는 데 매우 효과적입니다. 그러나 이제 코드를 쉽게 다시 작성할 수 없습니다. 물론, 원하는 코드를 나타 내기 위해 트리 구조를 수정할 수는 있지만 소스 코드를 출력하는 데 사용할 수는 없습니다. 각 노드와 관련된 토큰이 원본 텍스트에서 수정해야 할 위치를 알 수있는 충분한 정보를 얻을 수 있기를 기대했지만 토큰 색인이나 행/열 번호 만 있으면됩니다. 줄 번호와 열 번호를 사용하려면 소스 코드를 두 번째 통과해야합니다.
ANTLR을 올바르게 사용하여 필요한 것을 수행하는 방법을 이해하지 못하는 것 같습니다. 이 문제를 해결할 더 적절한 방법이 있습니까?
* "이 문제를 해결하는 더 적절한 방법이 있습니까?" 당신은 당신의 입력을 분석하고 조작 한 다음 직접 출력합니다. StringTemplate, Dave가 언급했듯이이를 도와 줄 수 있습니다. –