Пишу парсер некоего самопального конфига. В конфиге среди прочего встречаются в вещи типа filter = "тут какая-то строка". Соответственно в грамматике это выглядит примерно так id '=' quotedString.
Но внезапно возникла необходимость включить в конфиг (и соответственно — парсить) некие простейшие выражения типа таких QQ > 1, AA < 10, ZZ = "это строка". Нарисовал правила типа такого (пишу по памяти): Int: (0..9)+; Operation: '='|'<'|'>'|''<=|'>='|'<>'; expr: token Operation (Int | quotedString) ;
Ругается на '='. Если для обозначения операции равенства использовать '==', то всё работает.
Лексер и парсер описываются в одном файле грамматики.
Вопрос первый: можно ли как-то использовать '=', а не '=='. Можно конечно парсером выдирать всё выражения и разбирать далее руками, но не хочется.
Вопрос второй на понимание (может смешной, но я в грамматиках лох): описанное выше проиходит от того, что ANTLR описывает контекстно-свободные грамматики? Т.е. если символ/токен где-то используется для одного действия (у меня для обозначения присвоения), то в другом значении его использовать нельзя. А была-бы контекстно связанная, то значение символа/токена могло бы зависть бы от контекста, и тогда бы разборе выражения был бы (можно было бы сделать) другой контекс со своим значением символа '='. Так?
Сообщение заговорено потомственным колдуном, целителем и магом в девятом поколении!
Модерирование или минусование сообщения ведет к половому бессилию, венерическим заболеваниям, венцу безбрачия и диарее!