불완전한 문법을 사용하는 일반적인 방법이 있습니까? 필자의 경우 필자는 단지 델파이 (파스칼) 파일에서 메소드를 감지하고자하는데, 이는 procedures
과 functions
을 의미한다. 다음과 같은 첫 번째 시도가 효과적입니다.불완전한 문법으로 파싱하기
methods
: (procedure | function | .)+
;
전혀 해결책입니까? 더 나은 해결책이 있습니까? 액션 (예를 들어, implementation
을 검출 한 후)으로 파싱을 중지 할 수 있습니까? 전 처리기를 사용하는 것이 합리적입니까? 그리고 예 - 어떻게?
grammar PascalFuncProc;
parse
: (Procedure | Function)* EOF
;
Procedure
: 'procedure' Spaces Identifier
;
Function
: 'function' Spaces Identifier
;
Ignore
: (StrLiteral | Comment | .) {skip();}
;
fragment Spaces : (' ' | '\t' | '\r' | '\n')+;
fragment Identifier : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
fragment StrLiteral : '\'' ~'\''* '\'';
fragment Comment : '{' ~'}'* '}';
이 트릭을 할 것입니다 :
antlr 등으로는 가능하지 않을지 모르지만, PEG 기반 파서에서는 다소 사소한 것입니다. 단지'(! methods.) +/methods'와 같은 규칙을 정의하면 전체를 구문 분석합니다 스트림으로'메소드'처럼 보이는 모든 것을 탐지합니다. 아마도 여기에서 주석과 문자열 리터럴도 처리하고 싶을 것입니다. –
절차/함수의'Begin'과'End;'사이에 모든 것을 원합니까? 또는 당신은 그 (것)들의 이름에서만 흥미 있는가? –
@ 바트 : 처음에는 이름 만 ... – ANTLRStarter