Синтаксический анализатор (то есть правила, начинающиеся со строчной буквы) и лексер (заглавная первая буква) ведут себя немного по-другому:
- Анализатор знает, какой токен он ожидает, и пытается сопоставить его (кроме случаев, когда у него есть несколько альтернатив - затем он просматривает следующие токены, чтобы увидеть, какую альтернативу выбрать)
- Однако лексер ничего не знает о правилах синтаксического анализатора - он соответствует тому, что может соответствовать текущему вводу. Когда несколько правил лексера могут совпадать с префиксом ввода:
- Это будет соответствовать (и выдавать токен) правилу, которое соответствует самой длинной последовательности
- Если несколько правил могут совпадать с одной и той же последовательностью, правило, находящееся ранее в файле (ближе к верху), выигрывает.
Таким образом, ваш ввод, скорее всего, будет маркирован на *:
MONTH Mar
(WS)
SESSID 9 - SESSID matches and is higher up than INTEGER
(WS)
SESSID 10
':' :
SESSID 19
':' :
SESSID 07
(WS)
PARTITION west - same as STRING but higher up - STRING will never be matched
(WS)
PARTITION info
(WS)
PARTITION tmm1
ALPHA [17280] - matches longer sequence than just '[' in rule "proc"
':' :
(WS)
SESSID 01870003
':' :
SESSID 6
':' :
(WS)
DOTSLASHSTRING /Common/mysaml.app/mysaml - longer than just '/' in rule "module"
MSGSTRING :Common:00000000: helloasdfasdf asdfadf vgnfg - the rest can be matched to this rule
Как видите, это совсем другие токены, чем ожидает ваш парсер.
Суть в том, что у вас слишком много логики в ваших правилах лексера, а именно вы пытались поместить смысловые значения в лексер. Это не подходит для этой задачи. Если одна входная последовательность может означать разные вещи (например, 123
может быть целым числом, шестнадцатеричным номером или идентификатором сеанса), это различие должно входить в синтаксический анализатор, так как оно может быть решено только на основе контекста (где в предложении это произошло ), а не содержанием самого 123
. Точно так же, если [17280]
может быть либо ALPHA
(независимо от того, что это) или INTEGER
в скобках, это решение должно быть включено в синтаксический анализатор, потому что это не может быть решено только просмотром [17280]
(теперь оно в лексере из-за к правилу ALPHA
).
* Вероятный токенизация основан на вводе с вашего скриншота, который находится на одной строке, тогда как сам ввод - на двух строках - не уверен, является ли это преднамеренным или результатом переноса строки.