#regex #bison #flex-lexer
#регулярное выражение #bison #гибкий лексер
Вопрос:
Я ищу способ проанализировать только определенную часть файла. Например, давайте посмотрим:
if {$cpf_step == "pre_restruct"} {
create_power_domain -name domain_GPU_SW
-shutoff_condition "!$mali_pso_condition_pin"
-instances "$GPU_SW_instances_list"
} else {
create_power_domain -name domain_GPU_SW
-shutoff_condition "!$mali_pso_condition_pin"
}
Меня интересуют команды create_power_domain. У меня есть правило с другим используемым в нем токеном. Вот правило, которое я использую
[РЕДАКТИРОВАТЬ] конечно, есть вещи до и после этого извлечения, а также другие команды create_power_domain, которые меня интересуют в разборе [/ РЕДАКТИРОВАТЬ]
file :list_of_statement
;
list_of_statement: statement
| list_of_statement statement
;
statement: power_domain
| T_EVERY_OTHER_THING_I_READ
;
power_domain: K_CREATE_POWERDOMAIN K_NAME K_IDENTIFIER options_list
Теперь, как вы можете понять, я хочу только проверить, что каждый домен мощности соответствует синтаксису, и я не хочу заботиться обо всем остальном.
В моем токенизаторе flex я попытался
.* {return T_EVERY_OTHER_THING_I_READ; }
но потом я вспомнил, что Lex пытается найти самое длинное совпадающее регулярное выражение, которое подразумевает, что теперь все будет токеном T_EVER_OTHER_THING_I_READ, и я, например, не найду свой K_CREATE_POWERDOMAIN.
Тогда мой вопрос в том, как мне игнорировать все, что не является частью интересующего меня правила?
если у вас есть дополнительные вопросы, не стесняйтесь задавать.
Спасибо
Ответ №1:
Предполагая, что power_domain разделен пробелом, табуляцией или новой строкой, исключение из T_EVER_OTHER_THING_I_READ должно помочь, поэтому попробуйте что-то вроде [^nrt ]* {return T_EVERY_OTHER_THING_I_READ; }
(непроверенный)
Комментарии:
1. Кажется, это делает свое дело. Спасибо. Теперь я могу учитывать только то, что меня интересует, мне просто нужно найти, как игнорировать что-то вроде K_NAME вне power_domain. На данный момент я решил добавить его следующим образом
statement: power_domain | list_of_identifier | K_NAME
но я попытаюсь просто найти, как присвоить каждому токену значение T_EVER_OTHER_THING_I_READ, если я раньше не нашел K_CREATE_POWERDOMAIN ! Еще раз спасибо2. Я возвращаюсь к своему токенизатору, и на самом деле кажется, что это правило плохо работает с другими моими токенами. Слишком многие из них классифицируются как T_EVER_OTHER_THING_I_READ