#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
что должно быть выводом, если этот код передается через лексический анализатор
лексический анализатор просто токенизирует поток, чтобы превратить поток символов в поток токенов (который позже будет проанализирован парсером для получения полного синтаксического дерева ). В вашем примере вы получите что-то вроде:
#include <stdio.h> (this is handled by preprocessor, not by lexer so it wouldn't exist)
int KEYWORD
main IDENTIFIER
( LPAR
) RPAR
{ LBRACE
int KEYWORD
a IDENT
, COMMA
b IDENT
; SEMICOL
a IDENT
= ASSIGN
a IDENT
+ PLUS
b IDENT
; SEMICOL
printf IDENT
( LPAR
"%d" STRING
, COMMA
a IDENT
) RPAR
; SEMICOL
return RETURN_KEYWORD
0 INTEGER
; SEMICOL
} RBRACE
Конечно, лексер сам по себе не может много сделать, он может просто разбить исходный текст на минимально возможные элементы, проверяя синтаксические ошибки (например, ключевые слова с ошибками). Вам понадобится что-то, что объединит их, чтобы придать им семантическое значение.
Небольшое примечание: некоторым лексерам нравится группировать похожие типы токенов только в один (например, токен KEYWORD
, содержащий все ключевые слова), используя связанный с ним параметр, в то время как у других есть другой токен. для каждого типа RETURN_KEYWORK
, IF_KEYWORD
и так далее ..
Директивы препроцессора не будут присутствовать во входных данных компилятора, поскольку препроцессор будет их использовать. Таким образом, #include
будет заменен содержимым файла stdio.h
.
Результирующий файл будет разбит на токенов
сканером
в соответствии с лексическими правилами
, которые можно найти здесь и будет передан парсеру
, когда он запрашивает токены.