Грамматика Lisp в yacc

У меня была эта проблема на Mac OS Sierra, когда я впервые запускал приложение Android React Native для Android:

Execution failed for task ':app:compileDebugJavaWithJavac'.

> Could not find tools.jar

Я изменил свою переменную среды JAVA HOME для Java Development Kit (JDK):

export JAVA_HOME='/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home'

на:

export JAVA_HOME='/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home'

Я выяснил, где была правильная версия после создания проекта в Android Studio и поиск местоположения JDK в настройках проекта.

20
задан Jonathan Leffler 14 February 2009 в 18:46
поделиться

6 ответов

Ошибка находится действительно в лексическом анализаторе. Ваши круглые скобки заканчиваются как последнее "." в лексическом анализаторе и не обнаруживаются как круглые скобки в синтаксическом анализаторе.

Добавляют правила как

\)     { return RPAREN; }
\(     { return LPAREN; }

к лексическому анализатору и изменяют все происшествия' (', ')' к LPAREN и RPAREN соответственно в синтаксическом анализаторе. (также, Вам нужно к #define LPAREN и RPAREN, где Вы определяете свой маркерный список)

Примечание: я не уверен в синтаксисе, могли быть обратные косые черты, являются неправильными.

11
ответ дан 30 November 2019 в 00:27
поделиться

Грамматика Lisp не может быть представлена как контекстно-свободная грамматика, и yacc не может проанализировать весь код шепелявости. Это из-за функций шепелявости, таких как оценка чтения и программируемый читатель. Так, чтобы только прочитать произвольный код шепелявости, у Вас должно быть полное выполнение шепелявости. Это не некоторая неясная, неиспользуемая функция, но она на самом деле используется. Например, ИНТЕРПОЛ CL, SQL CL.

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

12
ответ дан 30 November 2019 в 00:27
поделиться

Вы корректны в этом, необходимо определить нетерминальное. Это было бы определено как ряд sexpr. Я не уверен в синтаксисе YACC для этого. Я неравнодушен к , ANTLR для парсеров-генераторов и синтаксиса был бы:

program: sexpr*

Указание на 0 или больше sexpr.

Обновление с синтаксисом YACC:

program :  /* empty */
        | program sexpr
        ;

Не в YACC, но могло бы быть полезным так или иначе, вот полная грамматика в ANTLR v3, который работает на случаи, которые Вы описали (исключает строки в лексическом анализаторе, потому что это не важно для этого примера, также вывод консоли C# использования, потому что это - то, что я протестировал его с):

program: (sexpr)*;

sexpr: list
    |  atom            {Console.WriteLine("matched sexpr");}
    ;

list:     
   '('')'              {Console.WriteLine("matched empty list");}
   | '(' members ')'   {Console.WriteLine("matched list");}

    ;

members: (sexpr)+      {Console.WriteLine("members 1");};

atom: Id               {Console.WriteLine("ID");}
    | Num              {Console.WriteLine("NUM");}
    ;


Num: ( '0' .. '9')+;
Id: ('a' .. 'z' | 'A' .. 'Z')+;
Whitespace : ( ' ' | '\r' '\n' | '\n' | '\t' ) {Skip();};

Это не будет работать точно, как находится в YACC, потому что YACC генерирует и LALR-парсер, в то время как ANTLR является измененным рекурсивным спуском. Существует выходная цель C/C++ для ANTLR, если Вы хотели пойти тем путем.

4
ответ дан 30 November 2019 в 00:27
поделиться

Вам neccesarily нужен yacc/bison синтаксический анализатор? "Чтения подмножество читателя" синтаксиса шепелявости не то, что трудно для реализации в C (запускаются с функции read_sexpr отправьте read_list, когда Вы видите' (', который в свою очередь создает список содержавшего sexprs до')', замечен; иначе назовите read_atom, который собирает атом и возвращает его, когда он больше не может читать составляющие атомом символы).

Однако, если Вы хотите смочь считать arbritary язык Common LISP, Вам будет нужно к (в худшем), реализуют язык Common LISP, поскольку CL может изменить время выполнения читателя (и даже переключиться между другим временем выполнения таблиц чтения под программным управлением; довольно удобный, когда Вы желаете загрузить код, написанный на другом языке или диалекте шепелявости).

2
ответ дан 30 November 2019 в 00:27
поделиться

Вы могли попробовать эта грамматика здесь .

1
ответ дан 30 November 2019 в 00:27
поделиться

Это было долгое время, так как я работал с YACC, но Вам действительно нужен нетерминальный верхний уровень. Вы могли быть более конкретны относительно "испытанного это" и "это, казалось, не работало"? Или, в этом отношении, каковы ошибки?

я также подозревал бы, что YACC мог бы быть излишеством для такого легкого синтаксисом языка. Что-то более простое (как рекурсивный спуск) могло бы работать лучше.

1
ответ дан 30 November 2019 в 00:27
поделиться
Другие вопросы по тегам:

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