거꾸로 구문 분석하려는 ANTLR4 규칙의 일부가 있습니다. 그게 진짜 해결책이 아니라고 생각합니다. 그래서 내가 놓친 것 같습니다.ANTLR4 파서의 하위 규칙과 일치합니다.
내 문제의 핵심은 내 표현의 중간 부분에 내가 추출하고 싶은 부분이 있다는 것입니다. 그러나이 부분에는 가능한 경우 별개로 추출하려는 일부 (정의 된) 접미사가 있습니다. 이 접미어는 쉼표로 구분하거나 구분할 수 없습니다. 문법은 쉼표로 잘 작동하지만 쉼표가없는 경우 접미사가있는 경우에도 전체 부분은 unknown
으로 표시됩니다.
나는이 게시물의 하단에 표시되는 작은 예제로 내 문법을 정리했습니다.
문자열이 why hello, x y z foo bar baz blah blah blah, goodbye!
인 경우 내 문법은 x y z foo bar baz
을 phrase
으로 구문 분석합니다. 접미사로 x y z
을 unknown
및 foo bar baz
과 일치시키고 싶습니다. 쉼표 (x y z, foo bar baz
)가 있다면, 그것은 작동합니다
을 그러나, 쉼표가없는 경우, 그것은 전체 x y z foo bar baz
(물론 이후 텍스트의 일부 등) unknown
로 취
을 FO 할 수있는 방법이 있나요
: 나는 (+?
를) nongreedy로 unknown
을 변경 시도,하지만 phrase
에 대해 하나의 토큰을 소모뿐만 아니라 바람직하지 않다 phrase
규칙을 수정하여 오른쪽에서 첫 번째로 일치하는 접미사를 시도한 후 unknown
으로 떨어지십니까?
또 다른 방법을 넣어 : 그것은 하나 이상의 접미사 종료 될 때 제외 unknown
일치 아무것도 을하는 방법이 있나요? 의 구문 분석을
Another way to put it: is there a way to have unknown match anything except when it ends with one or more suffixes? (The suffixes can appear in the text as long as they're not at the end)
그러나 이전 :
이grammar Example;
// parse tree root
exampleExpression : ignored HELLO separator phrase separator? unknown separator? GOODBYE ignored;
// what I want to match
phrase : unknown (COMMA? suffix+)*;
// convenience rule for swaths of tokens to be ignored (e.g. at the beginning and end)
ignored : (unknown | separator)*;
// roll up unknown tokens under one rule
unknown : (~(PERIOD | COMMA | PIPE | BULLET | SP_SEP_DASH))+;
separator : PERIOD | COMMA | PIPE | BULLET | SP_SEP_DASH;
// the pre-defined suffixes
suffix : FOO | BAR | BAZ;
/* TOKENS */
HELLO : 'hello';
GOODBYE : 'goodbye';
FOO : 'foo';
BAR : 'bar';
BAZ : 'baz';
/* FRAGMENTS */
fragment DIGIT : [0-9];
fragment DASH : '-';
/* REMAINING TOKENS */
LPAREN : '(' ;
RPAREN : ')' ;
COMMA : ',';
PERIOD : '.';
PIPE : '|';
BULLET : '\u00B7' | '\u2219' | '\u22c5';
SP_SEP_DASH : SP DASH SP;
SP : [ \u000B\t\r\n] -> channel(HIDDEN);
NUMBER : ([0] | [1-9] DIGIT*) ('.' DIGIT+)?;
WORD : [A-Za-z] [A-Za-z-]*;
// catch-all
OTHER : .;
Wild guess : 'phrase : unknown COMMA? (접미사 +) *;'대신'phrase : unknown (COMMA? suffix +) *;'를 사용합니다. –
@ 500-InternalServerError : 분명히'(suffix +) *'는'suffix * '와 동일하지만 실제로는 괄호 안에있는 COMMA가있는 접미사 +가 필요합니다. IOW : '콤마? (접미사 + COMMA) * 접미사 +'. 그러나 그것이 그것이 근본적인 문제라고 생각하지 않습니다. – rici
필자의 주장에 따르면'phrase '는'COMMA'도 존재할 경우에만'suffix'를 받아들이는 것처럼 보입니다. –