필자는 antlr 렉서 규칙의 이상한 부작용이 있으며 필자는이를 증명할 (거의) 최소한의 작업 예제를 만들었다. 예를 들어, 문자열 [0..1]
과 일치시키고 싶습니다. 그러나 문법을 디버깅 할 때 구문 분석기에 도달하는 토큰 스트림은 [..1]
만 포함합니다. 첫 번째 정수는 얼마나 많은 자릿수가 포함되어 있어도 항상 소비되며 어떻게되는지에 대한 단서가 없습니다. 내가 FLOAT
규칙을 제거하면 모든 것이 잘되므로 실수는 그 규칙의 어딘가에 있다고 생각합니다. 그러나 그것은 전혀 일치하지 않아야합니다. [0..1]
나는 전혀 의아해합니다.ANTLR 렉서 규칙은 일치하지 않아도 문자를 소비합니까?
내가 잘못했을지도 모를 포인터에 대해 기뻐할 것입니다. 이건 내 예입니다
grammar min;
options{
language = Java;
output = AST;
ASTLabelType=CommonTree;
backtrack = true;
}
tokens {
DECLARATION;
}
declaration : LBRACEVAR a=INTEGER DDOTS b=INTEGER RBRACEVAR -> ^(DECLARATION $a $b);
EXP : 'e' | 'E';
LBRACEVAR: '[';
RBRACEVAR: ']';
DOT: '.';
DDOTS: '..';
FLOAT
: INTEGER DOT POS_INTEGER
| INTEGER DOT POS_INTEGER EXP INTEGER
| INTEGER EXP INTEGER
;
INTEGER : POS_INTEGER | NEG_INTEGER;
fragment NEG_INTEGER : ('-') POS_INTEGER;
fragment POS_INTEGER : NUMBER+;
fragment NUMBER: ('0'..'9');
예기치 않은 문제가 발생했습니다. 포괄적 인 예제를 주셔서 감사합니다. 지금까지 모든 것을 실행하고 있습니다 :-) – Lichtblitz
@Lichtblitz, 천만에요, 네, 토큰 화'..' (INT-와 FLOAT- 토큰과 함께)는 까다 롭습니다. ! :) –