2012-07-13 1 views
0

В BASIC заявлении печати может выглядеть следующим образом:Регулярного выражения, чтобы соответствовать запятой не внутри строкового литерала

100 PRINT "Copyright, Adrian McMenamin","maybe" 

Который должен поставить закладку пространства между первым оператором и вторым.

Я работаю на DSL/переводчика для BASIC в Groovy/Java, который нужно разобрать эту строку и производить что-то вроде:

print "Copyright, Adrian McMenamin", " ","maybe" 

(Как Groovy интерпретирует запятую как только отделяющую параметры печати function.)

Итак, какое регулярное выражение будет различать запятые не внутри цитаты, а те, которые есть (не беспокойтесь о PRINT или номере линии и т. д.)?

+1

Что такое грамматика для строк на языке BASIC? Возможно ли избежать кавычек внутри строки? –

+2

Почему вы не марксируете запятые, а затем присоединяетесь к полученной коллекции с вкладками вместо того, чтобы пытаться анализировать регулярные выражения? –

+0

Да, запятые могут появляться внутри строковых литералов в BASIC. Точка токенинга хорошая. – adrianmcmenamin

ответ

0

Я реализовал очень простой парсер, который только что подсчитал открытые кавычки (по модулю 2). Он работает с учетом простых правил для строкового литерала BASIC. я разработал очень красивую рекурсивную функцию с использованием регулярных выражений, который будет работать правильно для этой формы:

100 PRINT "Copyright, 2012", "Adrian McMenamin" 

Но не сумевшее за это:

100 PRINT "Copyright, 2012" 

Ну, думает, что это просто предел DFA-подобная схема.

7

Вы смотрите parsing и grammar, которые не могут обрабатываться регулярными выражениями. Как правило, вам нужно будет держать счет на открытых или закрытых скобках, которые выходят за рамки регулярных выражений. Вы можете посмотреть на парсеры вроде ANTLR, которые решают эту проблему. Это может быть overkill для этой задачи, но я предполагаю, что вам придется переводить несколько типов базового оператора, а затем синтаксический анализатор действительно то, что вам нужно, а не регулярное выражение.

+0

Я знаю, что регулярное выражение не может рассчитывать, но оно может рекурсивно соответствовать на необработанных кусках. Я не использую парсер, потому что я не знаю, как и это похоже на излишний! – adrianmcmenamin

+4

Нет, это не overkill. '" Например, строки могут иметь \ "экранированные кавычки и многое другое! \" "'. –

+0

(Вне области формальных регулярных выражений, но не вне пределов реализации [все] "регулярных выражений". есть некоторые * очень страшные * perl-примеры, и я думаю, что «рекурсивное регулярное выражение» может справиться с этим, но эта магия превыше меня. В любом случае, общий ответ +1). –

 Смежные вопросы

  • Нет связанных вопросов^_^