저는 연산자 우선 순위가없는 문법을 만들려고합니다. 그러나 하나의 연산자를 사용하거나 괄호로 묶어야합니다. (단순화를 위해 유효한 연산자 대신 여기에 id|int_literal etc
및 +
대신 test
을 사용). 따라서 예 :backtrack = true를 사용하지 않고 어떻게 해결할 수 있습니까?
test + test ///valid!
(test + test) + test ///valid!
(test + test) + (test + test) /// valid!
test + test + test /// invalid!
backtrack = true가 필요하지 않은 문법을 작성하는 방법이 있습니까? 왼쪽 탈퇴가 실제로 여기에 의미가 있다고 생각하지 않습니다. 그리고 나는 구문 론적 술어가 어떻게 도움이 될지 확신하지 못합니다.
가 여기에 내가 가진 무엇 (backtrack=true
필요) :
fragment
bexpr : 'test' | '(' cbebr ')';
fragment
cbexpr : bexpr '+' bexpr;
expr : bexpr | cbexpr;
그러나 '+'가 중복되지 않으면이 작업을 수행 할 수있는 방법이 있습니까? 더 많은 연산자가있을 때 긴리스트가 두 번 복제되게되면 추한 상태가됩니다. –
'(테스트)'가 유효합니까? –
예. 유효합니다. –