120 lines
1.9 KiB
Markdown
120 lines
1.9 KiB
Markdown
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 <stdio.h>
|
|
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) |