У меня была эта проблема на 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 в настройках проекта.
Ошибка находится действительно в лексическом анализаторе. Ваши круглые скобки заканчиваются как последнее "." в лексическом анализаторе и не обнаруживаются как круглые скобки в синтаксическом анализаторе.
Добавляют правила как
\) { return RPAREN; }
\( { return LPAREN; }
к лексическому анализатору и изменяют все происшествия' (', ')' к LPAREN и RPAREN соответственно в синтаксическом анализаторе. (также, Вам нужно к #define LPAREN и RPAREN, где Вы определяете свой маркерный список)
Примечание: я не уверен в синтаксисе, могли быть обратные косые черты, являются неправильными.
Грамматика Lisp не может быть представлена как контекстно-свободная грамматика, и yacc не может проанализировать весь код шепелявости. Это из-за функций шепелявости, таких как оценка чтения и программируемый читатель. Так, чтобы только прочитать произвольный код шепелявости, у Вас должно быть полное выполнение шепелявости. Это не некоторая неясная, неиспользуемая функция, но она на самом деле используется. Например, ИНТЕРПОЛ CL, SQL CL.
, Если цель состоит в том, чтобы проанализировать подмножество шепелявости, то текст программы является последовательностью sexprs.
Вы корректны в этом, необходимо определить нетерминальное. Это было бы определено как ряд 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, если Вы хотели пойти тем путем.
Вам neccesarily нужен yacc/bison синтаксический анализатор? "Чтения подмножество читателя" синтаксиса шепелявости не то, что трудно для реализации в C (запускаются с функции read_sexpr отправьте read_list, когда Вы видите' (', который в свою очередь создает список содержавшего sexprs до')', замечен; иначе назовите read_atom, который собирает атом и возвращает его, когда он больше не может читать составляющие атомом символы).
Однако, если Вы хотите смочь считать arbritary язык Common LISP, Вам будет нужно к (в худшем), реализуют язык Common LISP, поскольку CL может изменить время выполнения читателя (и даже переключиться между другим временем выполнения таблиц чтения под программным управлением; довольно удобный, когда Вы желаете загрузить код, написанный на другом языке или диалекте шепелявости).
Это было долгое время, так как я работал с YACC, но Вам действительно нужен нетерминальный верхний уровень. Вы могли быть более конкретны относительно "испытанного это" и "это, казалось, не работало"? Или, в этом отношении, каковы ошибки?
я также подозревал бы, что YACC мог бы быть излишеством для такого легкого синтаксисом языка. Что-то более простое (как рекурсивный спуск) могло бы работать лучше.