# Lexical Analysis 포트란은 모든 whitespace를 지움. ```fortran do 5 I = 1.25 ``` ``` do 5 I = 1,25 ``` ## Tokens 대표적인 토큰의 예시 * Identifiers * Keywords * Integers * Floating-points * Symbols * Strings 하기 위해서 하는 것 * Specification 확실하게 명세를 해줘야함. * Recognition DFA를 이용해서 패턴 매칭 * Automation RE로 부터 DFA를 generate해야함 Lex라는 툴을 이용 그러나 내부적으로는 Tompson's construction (RE -> NFA), Subset Construction(NFA -> DFA)도 알아야함 ## Specification **Regular Expression** * 여러가지에 사용됨 `grep`, `find`, `sed`, `awk` Multiple Matches `elsex = 0`이라는 코드에서 `else / x / = / 0` 또는 `elsex / = 0` 두가지 선택지가 있음. 둘 중 하나를 무조건 골라야함. 이때 가장 긴 토큰이 선택된다. * `elsex`가 `else`보다 더 길어서 `elsex`가 선택됨. 만약에 두 경우가 모두 똑같다면 토큰 종류의 우선순위에 따라 선택된다. * `Keyword`가 `Identifier`가 더 높음. ## Recognition FSA를 이용함. DFA와 NFA의 표현력은 동일하나 DFA는 편하게 구현할 수 있다는 장점이 있음. NFA는 RE로부터 쉽게 변환가능하다는 장점이 있음. **Lexical Analysis** `Lexical Spec -> RE -> NFA -> DFA -> Table` ## Automation * `Lex`(`Flex`: faster implementation of Lex) * `Bison` ### Lex/Flex * Definition Section * can declear or include var, enumeration, using the code in between `%{`, `%}` * provide names sub-rules for complex patterns used in **rules** * Rules Section * Lexical Pattern * User Function Section * Copied to the Lex Program ```c // example.l %{ #include int num_lines = 0; %} %% [ \t] {} a | an | the {printf("%s: is an article\n", yytext)} [a-z]+ {printf("%s: ???\n", yytext)} %% main() { yylex();1 } ``` ### Handwork * Thompson's construction (RE -> NFA) * Subset Construction(NFA -> DFA) DFA Optimization