ANTLR - проверка на «сжатие» строки - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время работаю с ANTLR и обнаружил что-то интересное, что не работает, как я планировал.

Я пытаюсь выполнить что-то вроде «test 10 cm» через мою грамматику, и это не удается, однако «test 10 c m» работает так же, как и предыдущий. Часть кода «cm» - это то, что я называю «целым блоком» в моей грамматике, и оно выглядит следующим образом:

wholeunit   :
              siunit
            | unitmod siunit
            | wholeunit NUM
            | wholeunit '/' wholeunit
            | wholeunit '.' wholeunit
            ;

То, что он делает сейчас, это часть правила unitmod siunit, где unitmod = c и siunit = m. Что я хотел бы знать, так это как сделать так, чтобы грамматика по-прежнему следовала правилу «unitmod siunit» без необходимости пробела посередине, и я мог бы упустить что-то огромное. (Да, у меня есть пробелы и вкладки, помеченные для пропуска)

1 Ответ

0 голосов
/ 04 мая 2018

Вероятная причина - "см", рассматриваемый вместе как другой токен (возможно, тот же тип токена, что и "test"), а не "c" и "m" как отдельные токены.

Помните, что в лексере ANTLR правило, совпадающее с самым длинным входом, выигрывает.

Возможно, одним из решений было бы сделать правило wholeunit лексером, а не правилом синтаксического анализатора, и убедиться, что оно выше правила, которое соответствует любому слову (например, "test") - если один и тот же вход может соответствовать нескольким правилам, ANTLR выбирает первое правило в порядке их определения.

...