ANTLR에 새로운 오류입니다. ANTLRv4와 함께 DXF files의 파서를 작성하려고합니다. DXF 파일은 소위 그룹 코드를 사용하여 다음 데이터의 유형을 지정합니다. 일부 DXF 파일로부터ANTLR DXF 그룹 코드와 정수를 구별하십시오.
예 발췌 예 :
0
SECTION
2
HEADER
9
$ORTHOMODE
70
0
9
0
ENDSEC
제 0
다음 행의 문자열은 다음을 의미한다. 그룹 코드 70
은 예를 들어 0
인 16Bit 정수가 이어짐을 의미합니다. 내 문제는 다음과 같습니다. 그룹 코드 0
과 정수 0
을 어떻게 구별 할 수 있습니까? 예제 스 니펫에서는 정수 값에 약간의 들여 쓰기가있는 것 같지만 DXF 참조에서이 값에 대해 아무 것도 찾을 수 없습니다.
지금까지 ANTLR 문법 다음 한 내 생각 :
grammar SimpleDXF;
start : HEADER variable* ENDSEC ;
variable : varstart (groupcode NL value NL)+ ;
varstart : VAR ;
groupcode : INT ;
value : INT | ANYCHARSEQ ;
WS : [ \t]+ -> skip ;
NL : '\r'? '\n' ;
HEADER : '0' NL 'SECTION' NL '2' NL 'HEADER' NL ;
ENDSEC : '0' NL 'ENDSEC' NL ;
VAR : '9' NL VARNAME NL ;
VARNAME : '$' LETTER (LETTER | DIGIT)* NL ;
INT : DIGIT+ NL ;
ANYCHARSEQ : ANYCHAR+ NL ;
fragment ANYCHAR : [\u0021-\u00FF] ;
fragment LETTER : [A-Za-z_] ;
fragment DIGIT : [0-9] ;
그러나이 렉서하여 그룹 코드 0
로 간주되기 때문에, 정수 0
을 구문 분석 header
규칙의 원인을 시도 할 때 분명히 이것은 실패 .
그래서 지금 내 문제를 해결하는 방법을 알 수 없습니다. 어떤 도움을 주셔서 감사합니다.
편집
변경된 ANTLR 문법은 더 렉서 규칙을 포함합니다. 이제 문제는 렉서가 완전히 실패한다는 것입니다. 첫 번째 입력 문자는 HEADER
토큰의 일부가 아닌 INT
토큰입니다. 그 이유는 -> skip
으로 공백을 제거하는 것이 단일 토큰 안에있는 경우 작동하지 않습니다 (다음 예 참조).
start : 'A' 'B' ;
WS : [ \t\r\n]+ -> skip ;
을하지만이 문법이 작동하지 않습니다 : 입력 A B
(두 문자 사이의 공간)에 대한
은이 문법이 작동
start : AB ;
AB : 'A' 'B' ;
WS : [ \t\r\n]+ -> skip ;
나는 암시 적으로 하위 규칙으로'variable' 규칙이있다 :'(groupcode NL 값 NL) +'나는 또한 당신의 제안에이 하위 규칙을 교환했지만, 예상대로 나는 여전히 같은 결과를 얻는다. – schauk11erd
당신이 준 예제는 실제로이 규칙으로 분석 할 수 없다. groupcode 70 및 0으로 소비 된 값은 0과 NL ENDSEC으로 구성된 예상 엔드 포인트 사이에 0을 유지합니다. 그룹 코드 당 하나 이상의 값이 있습니까? –
그룹 코드 당 하나의 값만 가능하지만 헤더 섹션의 변수에는 여러 매개 변수 (그룹 코드 + 값)가있을 수 있습니다. IMO 문제는 'header'규칙 때문에 '0'값이 잘못된 토큰 클래스에 있다는 것인데, ''0 '...'은 렉서에게 0을위한 토큰을 생성하게한다. – schauk11erd