Почему синтаксические анализаторы онлайн, кажется, останавливаются в regexps?

Вы должны назначить идентификатор входному тексту, а также установить значение, а не innerHTML.

function getRndInteger(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}
Password 1: <input type="text" size="20" name="PW1" id="PW1" value="$PW1" required>
<button onclick="document.getElementById('PW1').value = getRndInteger(10000,99999)">Assign Random Password</button>

6
задан i_am_jorf 29 April 2009 в 17:56
поделиться

8 ответов

Я думаю, что это скорее культурная вещь. Использование контекстно-свободных грамматик в основном ограничено компиляторами, которые обычно имеют код, связанный с каждым рабочим правилом. На некоторых языках легче вывести код, чем симулировать обратные вызовы. В других вы увидите библиотеки синтаксических анализаторов: например, комбинаторы синтаксических анализаторов в Haskell. С другой стороны, регулярные выражения широко используются в таких инструментах, как grep, где запускать компилятор C каждый раз, когда пользователь дает новое регулярное выражение, неудобно.

4
ответ дан 10 December 2019 в 02:53
поделиться

Boost.Spirit выглядит так, как вам нужно.

Если вы ищете чтобы создать свой собственный, я использовал BNFC для моего последнего проекта компилятора, и он предоставляет грамматику, используемую в его собственной реализации . Это может быть хорошей отправной точкой ...

2
ответ дан 10 December 2019 в 02:53
поделиться

Because full-blown context-free grammars are confusing enough as they are without some cryptically dense and incomprehensible syntax to make them even more confusing?

It's hard to know what you're asking. Are you trying to create something like a regular expression, but for context-free grammars? Like, using $var =~ /expr = expr + expr/ (in Perl) and having that match "1 + 1" or "1 + 1 + 1" or "1 + 1 + 1 + 1 + 1 + ..."? I think one of the limitations of this is going to be syntax: Having more than about three rules is going to make your "grammar-expression" even more unreadable than any modern-day regular expression.

0
ответ дан 10 December 2019 в 02:53
поделиться

tcllib имеет что-то подобное, если вы можете смириться с грамматиками синтаксического анализа , а также TCL. Если Perl - ваша вещь, CPAN имеет Parse :: Earley . Здесь - чистый вариант Perl, который выглядит многообещающе. PLY представляется правдоподобным решением для Python

0
ответ дан 10 December 2019 в 02:53
поделиться

Теоретически это можно сделать с помощью Boost Spirit в C ++, но в основном это делается для статических грамматик. Я думаю, причина этого не в том, что CFG не так часто используются, как регулярные выражения. Мне никогда не приходилось использовать грамматику за исключением конструирования компилятора, но я много раз использовал регулярные выражения. CFG, как правило, намного сложнее, чем регулярные выражения, поэтому имеет смысл генерировать код статически с помощью таких инструментов, как YACC или ANTLR.

0
ответ дан 10 December 2019 в 02:53
поделиться

Side effect are the only thing I see thing that will get you. Most of the parser generators include embedded code for processing and you would need an eval to make that work.

One way around that would be to name actions and then make an "action" function that takes the name of the action to do and the args to do it with.

0
ответ дан 10 December 2019 в 02:53
поделиться

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

SimpleParse - это библиотека python, которая позволяет вам просто вставьте свою волосатую грамматику EBNF в свою программу и используйте ее, чтобы сразу разобраться, без промежуточных шагов. Я использовал его для нескольких проектов, где я хотел использовать собственный язык ввода, но на самом деле не хотел связываться с каким-либо формальным процессом сборки.

Вот небольшой пример из головы:

decl = r"""
    root := expr
    expr := term, ("|", term)*
    term := factor+
    factor := ("(" expr ")") / [a-z]
"""
parser = Parser(decl) 
success, trees, next = parser.parse("(a(b|def)|c)def")

Библиотеки комбинатора синтаксического анализатора для Haskell и Scala также позволяют выражать свою грамматику для вашего синтаксического анализатора в том же фрагменте кода, который его использует. Однако вы не можете, скажем,

2
ответ дан 10 December 2019 в 02:53
поделиться

Pyparsing ( http://pyparsing.wikispaces.com ) имеет встроенную поддержку синтаксического анализа packrat и представляет собой чистый Python, так что вы можете увидеть фактическую реализацию.

1
ответ дан 10 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

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