Как Java разделяет свой код на строки, используя ';'когда приходится иметь дело с ними в циклах и т. д.? - PullRequest
0 голосов
/ 30 марта 2019

Итак, как следует из названия, мой вопрос прост.Поскольку java использует точки с запятой внутри цикла for, как он узнает, находится ли точка с запятой в цикле for и когда это конец строки?

Вы можете сделать что-то вроде чтения каждой строки, преобразовав их водин символьный поток, но как парсер узнает, какая точка с запятой принадлежит циклу for, а какой конец строки?

Что-то вроде этого - то, что я имею в виду

String line = bufferedReaderObject.readLine(/*params*/);
char[] stream = line.toCharArray();

Но как парсер узнает, что точки с запятой в

for(int i = 0; i < j; i++)

не являются точками с запятой на концах строки?

РЕДАКТИРОВАТЬ: Чтобы сделать мой вопрос яснее, Java использует точку с запятой в числеиз разных мест (например, в forloops и в операторах завершения), как он различает терминатор оператора и точку с запятой внутри чего-то вроде цикла for

ПРИМЕЧАНИЕ: после прочтения комментария по этому вопросувнутри условия цикла for (внутри скобок "()") также операторы?

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Синтаксический анализатор не делает ничего более простого, чем просто разбивает программу на части, где есть точка с запятой. Не все точки с запятой созданы равными. Анализатор решает, что означает любая конкретная точка с запятой или любой другой символ, принимая во внимание все, что предшествовало этой точке с запятой или другому символу. Другими словами, парсеры понимают context .

Таким образом, точки с запятой, разделяющие управляющие выражения в операторе for, не будут перепутаны для операторов ввода, потому что синтаксический анализатор знает, что он находится в середине синтаксического анализа оператора for и в середине. оператора for точка с запятой - это просто «разделитель выражений управления», а не «оператор-конец».

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

0 голосов
/ 30 марта 2019

Java - это язык свободной формы , что означает, что пробелы (пробелы, табуляции, новые строки) не имеют значения.Мы используем пробелы для форматирования кода, чтобы его было легче читать человеку.Например,

for (int i = 0; i < j; i++)

имеет точно такое же значение, как:

for(int
i=0;i
<j;i
++)

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

Процесс компиляции состоит из многих этапов, но здесь есть два важных: (a) лексический анализ , которыйпреобразует код в поток токенов (отбрасывая такие элементы, как комментарии и пробелы);и (b) синтаксический анализ , который пытается понять токены при поиске синтаксических ошибок.Эти шаги в основном не зависят от того, как код выглядит для человека.

В вашем примере лексический анализатор будет генерировать поток токенов, например:

keyword "for"
left parenthesis
keyword "int"
name "i"
operator equals
number "0"
semi-colon

и так далее.Затем синтаксический анализатор распознает это как оператор for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...