Как разобрать ~ {expr} внутри строки с lark ebnf

Чтобы исключить исключительное исключение индекса массива, следует использовать инструкцию расширенный- for , где и когда они могут.

Основная мотивация (и использовать), когда вы выполняете итерацию, и вам не требуются сложные шаги итерации. Вы не могли бы использовать расширенный for для перемещения назад в массиве или только для итерации на каждом другом элементе.

Вы гарантированно не исчерпали элементы для повторения при этом, а ваш [исправленный] пример легко конвертируется.

Код ниже:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
    System.out.print(name[i] + "\n");
}

... эквивалентен этому:

String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
    System.out.println(firstName + "\n");
}

1
задан Evan Benn 13 July 2018 в 14:30
поделиться

2 ответа

Я думаю, что так оно и есть. К сожалению, любой, за которым не следует {, расколоет строку, но я смогу их восстановить позже. Меня обманывает одинаковый приоритет правил и жадность регулярных выражений.

/[^"~]+/ все, что не является или «(регулярная строка)

"~{" expression "}", нормальное выражение

/~(?!{)/ handle ~ без {. use? !, потому что мы не должны потреблять следующий символ (это может быть "или другое ~)

from lark import Lark

print (Lark(r"""
    string: "\"" string_thing* "\""
    string_thing: /[^"~]+/
        | "~{" expression "}"
        | /~(?!{)/
    expression: /[^}]+/
""", start='string', ambiguity="explicit").parse(
# '"a"'
'"a~b{}c}d~{1}g"'
# '"~abc~"'
# '"~{1}~~{1}~~~{1}"'
).pretty())
1
ответ дан Evan Benn 17 August 2018 в 12:37
поделиться

Вот решение вашей проблемы с использованием положительного lookbehind.

(?<=~{)[^}]+

Он ищет начало выражения ~{ и захватывает все до закрытия скобки }

0
ответ дан emsimpson92 17 August 2018 в 12:37
поделиться
  • 1
    Благодаря! Я не уверен, куда я должен поместить регулярное выражение. Также как будет выглядеть взаимодействие с другими правилами ebnf? я не знаю – Evan Benn 14 July 2018 в 03:41
  • 2
    Я не знаком с ebnf, поэтому не могу сказать точно. Что касается того, куда поместить регулярное выражение, попробуйте что-то вроде этого. Regex.Matches("(?<=~{)[^}]+", allofyourtext) – emsimpson92 16 July 2018 в 15:17
Другие вопросы по тегам:

Похожие вопросы: