Próbuję uchwycić polecenie, które wygląda jak _SC grać na pianinie 1 do drzewa z 3 węzły „_SC” „Play” i „Piano 1”ANTLR gramatyka jak uchwycić wszystkie znaki do końca linii
gramatyka mam tak daleko jest
grammar PBScript;
options {
output = AST;
language = CSharp2;
}
line : COMMAND WS ACTION;
COMMAND : '_SC';
ACTION : 'play';
WS : (' '|'\t')+ ;
Kiedy tworzę kolejną regułę, aby uchwycić „Piano 1” część tak:
grammar PBScript;
options {
output = AST;
language = CSharp2;
}
line : COMMAND WS ACTION WS PARAMETER;
COMMAND : '_SC';
ACTION : 'play';
WS : (' '|'\t')+;
PARAMETER
: (~('\n'|'\r'))+ ;
dostaję MismatchedTokenExceptio n (6! = 5). Uważam, że gramatyka jest zła i częściowo wiem, dlaczego jest źle. Jest niejednoznaczny, ponieważ WS pokrywa się z PARAMETREM. Po prostu nie wiem, jak to naprawić.
Są inne działania oprócz _SC i PARAMETER powinny być opcjonalne, będzie nawet inny typ linii, który ostatecznie będzie wyglądał jak Name: blah blah blah
, gdzie będę potrzebował przynajmniej "Nazwa" i "bla bla bla" w drzewie na wszelki wypadek to się liczy, ale teraz próbuję po prostu dowiedzieć się, co użyć w PARAMETRZE.
~ Tom
EDIT: Ciąg „Piano 1” powinien być dowolny ciąg znaków spoza nowej linii tak od pierwszej nie spacji po grze do końca linii.
Nie możesz zmienić gramatykę tak, że polecenie jest _SC play „Piano 1” zamiast _SC grać na Piano 1? Cytaty usunęłyby niejednoznaczność. – Eduardo
Znaki dwuznaczne są prawidłowe jako część ciągu. Gdybym oczekiwał, że tylko inni programiści skorzystają z tego, mógłbym zmusić ich do ucieczki z podwójnej wersji, ale przekazuję to osobom, które nie są szczególnie przyjazne komputerowi. – majinnaibu