Как я реализую ссылки вперед в компиляторе?

Устранена проблема, выполнив следующие действия -

1.Откройте файл уровня build.gradle уровня модуля, перейдите к зависимостям, перейдите к этой строке -

testImplementation 'junit:junit:4.12'

2.Измените версия junit для чего-либо еще ниже (например, 4.10)

testImplementation 'junit:junit:4.10'

3. Синхронизированный проект

4.В данном случае проблема устранена в моем случае

5. Установите версию junit на прежнее значение (4.12 в моем случае), если хотите

testImplementation 'junit:junit:4.12'

6.Sync project

Изменение версии junit и проекта синхронизации работало в моем случае.

5
задан lesmana 6 May 2013 в 14:35
поделиться

2 ответа

Его вполне можно проанализировать. Хотя существует неоднозначность между идентификаторами и ключевыми словами, lex с радостью справится с этим, присвоив ключевым словам приоритет.

Я не понимаю, какие еще есть проблемы. Вам не нужно определять, действительны ли идентификаторы на этапе синтаксического анализа. Во время синтаксического анализа вы строите дерево синтаксического анализа или абстрактное дерево синтаксиса (разница незначительна, но не имеет отношения к целям данного обсуждения). После этого вы создаете свои вложенные структуры таблиц символов, выполняя проход через AST, сгенерированный во время синтаксического анализа. Затем вы выполняете еще один проход через AST, чтобы проверить правильность используемых идентификаторов. После этого выполните один или несколько дополнительных синтаксических анализов AST для генерации выходного кода или какой-либо другой промежуточной структуры данных, и все готово!

РЕДАКТИРОВАТЬ: Если вы хотите увидеть, как это делается, проверьте исходный код для Mono C # компилятор. На самом деле он написан на C #, а не на C или C ++, но он использует порт Jay .NET для .NET, который очень похож на yacc.

Если вы хотите увидеть, как это делается, проверьте исходный код компилятора Mono C #. На самом деле он написан на C #, а не на C или C ++, но он использует порт Jay .NET для .NET, который очень похож на yacc.

Если вы хотите увидеть, как это делается, проверьте исходный код компилятора Mono C #. На самом деле он написан на C #, а не на C или C ++, но он использует порт Jay .NET для .NET, который очень похож на yacc.

7
ответ дан 14 December 2019 в 04:46
поделиться

Один из вариантов - иметь дело с прямыми ссылками, просто сканируя и кэшируя токены, пока вы не достигнете чего-то, с чем вы знаете, что делать (что-то вроде восстановления после ошибок в "паническом режиме"). После того, как вы продумали весь файл, вернитесь и попробуйте повторно разобрать биты, которые не были t разбирать раньше.

Что касается необходимости писать лексер вручную; Не делайте этого, используйте lex для генерации обычного парсера и просто считайте его через написанную от руки прокладку, которая позволяет вам вернуться и загрузить парсер из кеша, а также то, что делает lex.

Что касается создания нескольких грамматик, немного поразвлечься с препроцессором в файле yacc, и вы сможете сделать их все из одного исходного источника

1
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

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