컴파일러 원리 - 귀속 하강 분석기
컴파일링 원리 - 간단한 귀속 하강 문법 분석기 LL(1)
인터넷에서 귀속 하강 분석기에 관한 많은 블로그를 보았지만 모두 만족스럽지 못했다. 첫째, 쓴 프로그램이 틀렸고, 둘째, 해석이 분명하지 않았다.그래서 자기가 한 편 쓰는 김에 배운 것을 총결해 보려고 합니다.
역귀하강 분석법
귀속하강분석법의 원리는 함수 간의 귀속조를 이용하여 문법 트리의 위에서 아래로의 구축 과정을 모의하는 것이다.뿌리 노드에서 출발하여 입력 열에서 가장 왼쪽 일치하는 서열을 찾아 문법 트리를 만듭니다.왼쪽 귀속과 모든 비종결자를 포함하지 않는 모든 후보 종결 첫 번째 문자 집합이 서로 교차하지 않는 조건에서 우리는 거슬러 올라가지 않는 자정향하의 분석 프로그램을 구성할 수 있다. 이 분석 프로그램은 하나의 귀속 과정(또는 함수)으로 구성되고 모든 과정(또는 함수)은 문법에 대응하는 비종결부호가 아니다.
지식을 준비하다
문법의 모든 비종결자에 대해Fisrt 집합,Follow 집합,Select 집합을 계산합니다.책의 정의는 정말 이해하기 어려울 것 같다. 다음은 정의와 수학 기호를 붙이지 않고 블로거 개인의 이해만 붙인다.
4
4
4
예제
문법G: E->TE'E'->+E|ε T->FT’ T’->T|ε F->PF’ F’->*F’|ε P->(E)|a|b|v 계산된 Select 집합: Select(E->TE') = {(,a,b,v}Select(E'->+E) = {(,+}Select(E'->ε) = {(,#} Select(T->FT’) = {(,a,b,v} Select(T’->T) = {(,a,b,v} Select(T’->ε) = {+,),#} Select(F->PF’) = {(,a,b,v} Select(F’->*F’) = {*} Select(F’->ε) = {(,a,b,v,),+,#} Select(P->(E)) = {(} Select(P->a) = {a} Select(P->b) = {b} Select(P->v) = {v}
프로그램 구현
4
4
4
C 언어 코드
#include
#include
#include
#define LEN 100
char str[LEN];
int i;
bool flag=true;
void E();
void E1();
void T();
void T1();
void F();
void F1();
void P();
int main(){
int m;
printf(" :");
scanf("%d",&m);
while(m--){
printf(" ( # ):");
scanf("%s",&str);
i=0;
E();
if(flag==true){
printf("%s !
",str);
}else{
printf("%s !
",str);
}
strcpy(str,"");
}
}
void E(){
if(flag){
if(str[i]=='('||str[i]=='a'||str[i]=='b'||str[i]=='v'){
T();
E1();
}else{
flag=false;
}
}
}
void E1(){
if(flag){
if(str[i]=='+'){
i++;
E();
}else if(str[i]!='#'&&str[i]!=')'){
flag=false;
}
}
}
void T(){
if(flag){
if(str[i]=='('||str[i]=='a'||str[i]=='b'||str[i]=='v'){
F();
T1();
}else{
flag=false;
}
}
}
void T1(){
if(flag){
if(str[i]=='('||str[i]=='a'||str[i]=='b'||str[i]=='v'){
T();
}else if(str[i]!='+'&&str[i]!=')'&& str[i]!='#'){
flag = false;
}
}
}
void F(){
if(flag){
if(str[i]=='('||str[i]=='a'||str[i]=='b'||str[i]=='v'){
P();
F1();
}else{
flag=false;
}
}
}
void F1(){
if(flag){
if(str[i]=='*'){
i++;
F1();
}else if(str[i]!='('&&str[i]!='a'&&str[i]!='b'&&str[i]!='v'&&str[i]!='+'&&str[i]!=')'&&str[i]!='#'){
flag = false;
}
}
}
void P(){
if(flag){
if(str[i]=='('){
i++;
E();
if(str[i]==')'){
i++;
}
}else if(str[i]=='a'){
i++;
}else if(str[i]=='b'){
i++;
}else if(str[i]=='v'){
i++;
}else{
flag=false;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.