#java #regex #string
Вопрос:
Я пытаюсь написать интерпретатор для грамматики формы Backus Naur. Ниже приводится грамматика:
<statement> ::= <assignment> | “PRINT” “(” <expression> “)”
<assignment> ::= <variable> = <expression>
<expression> ::= <term> <expression*>
<expression*> ::= “ ” <expression> | “-” <expression> | “”
<term> ::= <factor> <term*>
<term*> ::= “*” <term> | “/” <term> | “”
<factor> ::= <number> | <variable> | “(” <expression> “)”
<variable> ::= <lowercase> <variable*>
<variable*> ::= <variable> | “”
<number> ::= <digit> <number*>
<number*> ::= <number> | “”
Я пытаюсь написать код, который определяет, является ли строка выражением. Моя идея заключается в том, что я беру строку и использую функцию разделения, чтобы разделить все отдельные слова и символы. Я делаю это, делая что-то вроде этого String[] words = line.split("\s ");
Когда я это сделаю, он превратит строку, как String line = "y = x 12 * z"
в String[] words = ["y", "=", "x", " ", "12", "z"]
. Для меня это не проблема. Проблема возникает, однако, когда у меня есть выражение как таковое String line = "x=12 z"
, Когда я пытаюсь разделить его с помощью своего регулярного выражения, оно даст мне String[] words = ["x=12 z"]
. Есть ли какой-либо способ, которым я могу разделить строку на слова, где она превратит любой из следующих символов в свои собственные слова в массиве: , -, *, /, =, (, )
Например, если у меня есть строка String line = "x = z 12 * y -(z *var )"
, она станет String[] words = ["x", "=", "z", " ", "12", "*", "y", "-", "(", "z", "*","var", ")"]
Ответ №1:
Вы можете попробовать передать регулярное выражение, подобное этому, в split()
метод:
String[] words=line.split("((?=[= \-*/()])|(?<=[= \-*/()]))");
Пример:
"z=x (y-56)/(4 2*x)" => String[18] { "z", "=", "x ", " ", " ", "(", "y", "-", "56", ")", "/", "(", "4", " ", "2", "*", "x", ")" }
Как вы видите, он также обрабатывает пробелы, но вы должны удалить их после разделения.