Как использовать файлы грамматики, сгенерированные ANTLR?

Вам нужны скобки для определения массива. «Недопустимый» означает, что вы пытаетесь получить доступ к индексу команды массива.

init_medians=np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)

У вас есть вторая проблема, возможно, поскольку последняя строка массива имеет 4 элемента, так что init_medians будет:

array([list([0.1, 0.2, 0.3]), list([0.4, 0.5, 0.6]),
       list([0.7, 0.8, 0.9]), list([0.01, 0.02, 0.03, 0.04])]

Скорее отличается от:

np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])
[ 116] Если вы удалите один элемент

5
задан Sam Lee 12 March 2009 в 04:30
поделиться

4 ответа

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

Очень короткий ответ - то, что ANTLR является парсером-генератором, что означает, что он генерирует код для парсинга текста. Общее использование должно проанализировать текст языка программирования. Я не прочитал учебное руководство, к которому Вы обращаетесь, но я предположил бы текст, который анализирует этот синтаксический анализатор, ряд инструкций по калькулятору, чего-то как

ADD 2 4
MULTIPLY 4 8

Для использования программы, которую Вы показали выше, Вы выполнили бы ее как любая другая программа C. Первым аргументом (argc) должно быть количество аргументов, и вторым (argv) должен быть текст, который будет проанализирован.

Для изучения ANTLR с нуля, я рекомендую прочитать книгу, опубликованную Terence Parr, автором ANTLR.

-1
ответ дан 15 December 2019 в 06:35
поделиться

Таким образом, то, когда Вы запускаете эту программу, Вы дали здесь первый параметр командной строки, будет названием файла для парсинга.

Шаг один, попробуйте это (выполните его и дайте ему файл).

Шаг два, возвратитесь и отредактируйте свой вопрос, но измените направление немного. Вместо того, чтобы спросить, "как я использую код", пытаются спросить, "как я делаю __________ с этим", где пробел заменяется некоторым описанием того, что Вы пытаетесь выполнить.

Так parser->expr(parser) кажется, анализирует маркерный поток, прибывающий из Вашего файла, который должен произвести AST. Предположение моего пути через большое количество деталей, я предложил бы смотреть на то, что это возвращает, особенно value участник, если это имеет тот. Кажется, существует убивание учебных руководств на строке, которые выглядят подобными тому, что Вы делаете, никакие идентичные два.

Если все остальное перестало работать, продвиньтесь с учебным руководством и любым, который 1) это ответит на Ваши вопросы или 2) это не будет, и можно попробовать другого.

0
ответ дан 15 December 2019 в 06:35
поделиться

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

Выходом из обнаруженного мною недоумения является ключевое слово «возвращает»:

token returns [TreeNode value]
    :    WORD { $value = new TreeNode( "word", $WORD.Text ); }
    |    INT { $value = new TreeNode( "int", $INT.Text ); }
    ;

WORD:    ('a'..'z'|'A'..'Z')+;
INT :    ('0'..'9')+;

TreeNode - это класс, который я создал. Сложность заключалась в том, как это сделать с помощью, скажем, нескольких токенов. Решение, которое я придумал, было рекурсией:

expr returns [Accumulator value]
    :   a=token  (WS+ b=expr)?
    {
        if( b != null )
        {
            $value = new Accumulator( "expr", a.value, b.value );
        } else
        {
            $value = new Accumulator( "expr", a.value );
        }
    }
    ;

Accumulator - это созданный мной класс с двумя разными конструкторами. Один конструктор инкапсулирует один токен, а другой инкапсулирует один токен и другой экземпляр Accumulator. Обратите внимание, что само правило определяется рекурсивно, и что b.value является экземпляром Accumulator. Зачем? Поскольку b - это expr, а определение expr имеет , возвращает [Accumulator value] .

Окончательное результирующее дерево представляет собой единственный экземпляр Accumulator, который сгруппировал все токены. Чтобы действительно использовать это дерево, вы выполняете некоторую настройку, а затем вызываете метод с тем же именем, что и правило, в отношении которого вы анализируете свой контент:

Antlr.Runtime.ANTLRStringStream stringstream =  new Antlr.Runtime.ANTLRStringStream( script );
TokenLexer lexer = new TokenLexer( stringstream );
Antlr.Runtime.CommonTokenStream tokenstream = new Antlr.Runtime.CommonTokenStream( lexer );
TokenParser parser = new TokenParser( tokenstream );

Accumulator grandtree = parser.expr().value;

Надеюсь, это поможет людям, которые сталкиваются с этим недоумением.


Обновить

Есть более простой способ собирать элементы в списки, из-за того, как система позволяет вам вставлять код на целевом языке в то, что кажется произвольным местоположением шаблона. Идиома такая:

sequence returns [String k]
    :   (e=atom { $k = $e.k; })
        (e=atom { $k += ", " + $e.k; })*
        { $k = "sequence (" + $k + ")"; } ;

Строка k инициализируется значением k первого атома, а последующие атомы получают от + = до k . Фрагмент $ ek ссылается на правило , которое возвращает атом [String k] , определенное в другом месте. Если такого правила нет, вы можете использовать свойство text (например, $ e.text , которое есть у токенов. Я не уверен, есть ли у других токенов это свойство Если нет, вы можете просто сделать:

nonToken returns [String whatever] : e=TOKEN { $whatever = $e.text; } ;

Что бы вы затем использовали в правилах более высокого уровня, например,

e=nonToken { System.out.println($e.whatever); }
4
ответ дан 15 December 2019 в 06:35
поделиться

Посмотрите видео Скотта Стэнчфилда, часть 8 http://vimeo.com/groups/29150/videos/8377479 . Он делает это на Java, но тот же принцип можно применить и в C (++).

0
ответ дан 15 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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