каким должен быть вывод лексера в c? - PullRequest
5 голосов
/ 18 апреля 2010
#include<stdio.h>

int main()
{
  int a,b;
  a=a+b;
  printf("%d",a);
return 0;
}

что должно быть на выходе, если этот код передан через лексер

Ответы [ 2 ]

12 голосов
/ 18 апреля 2010

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

#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 и т. Д.

3 голосов
/ 18 апреля 2010

Директивы препроцессора не будут присутствовать во входных данных для компилятора, так как препроцессор будет их использовать. Таким образом, #include<stdio.h> будет заменено содержимым файла stdio.h.

Полученный файл будет разбит на tokens на scanner в соответствии с lexical rules, который можно найти здесь , и будет передан parser, как и когда он запрашивает для токенов.

...