Скажем, у меня есть три символа A, B, C.
В ANTLR, как мне указать, что в предложении A, B и C могут появляться не более одного раза и что они могут встречаться в любом порядке. (Например, ABC, BCA оба законны)
Я пытался
(A | B | C)*
зная, что он позаботится только о части «любого порядка», но не мог придумать, как сказать, что это может появиться только один раз.
Отредактировано: я пробовал использовать логические флаги, которые работали, но кажутся слишком сложными - должен быть более простой способ, да?
myrule;
{
boolean aSeen = false;
boolean bSeen = false;
boolean cSeen = false;
}
:
( A { if (aSeen) throw RuntimeException("alraedy seen") else aSeen = true; }
| B { if (bSeen) throw RuntimeException("alraedy seen") else bSeen = true; }
| C { if (cSeen) throw RuntimeException("alraedy seen") else cSeen = true; }
)*
;
S := ABC | ACB | BAC | BCA | CAB | CBA
не гламурно, но концептуально прост. Если ANTLR может работать с неограниченной грамматикой, вы можете сделать что-то вродеS := ABC
,AB := BA
,AC := CA
,BC := CB
, а затем последние три в обратном порядке. Первый способ требуетn!
продукции, второйn^2
. - person Patrick87   schedule 20.07.2017