>웹 프론트엔드 >JS 튜토리얼 >자바스크립트를 사용하여 4개의 산술 컴파일러의 어휘 분석 작성

자바스크립트를 사용하여 4개의 산술 컴파일러의 어휘 분석 작성

php是最好的语言
php是最好的语言원래의
2018-08-06 13:40:421923검색

저희 3학년에는 컴파일 원리라는 과정이 있는데, 이를 위해서는 간단한 컴파일러를 직접 작성해야 합니다. 글쎄요, 어떤 언어든 사용할 수 있습니다. 물론 저는 js를 사용하지만 아주 우아하지는 않습니다. 나는 그것을 사용합니다. 이것은 언어와는 아무런 관련이 없으며 단지 js를 사용하는 것을 좋아하고 거기에 사용되는 js 기능이 많지 않습니다.

게다가 코드가 좀 형편없으니 불평하지 마세요.

전체 과정을 먼저 말씀드리겠습니다

  1. 첫 번째 단계는 어휘 분석입니다. 정규식을 작성한 다음 그 안의 모든 단어와 숫자 기호를 잘라내야 합니다.

  2. 문법 규칙을 구축합니다. 여기서는 LL(1) 문법을 선택했습니다. 여기에서 자신만의 문법을 디자인해 보세요.

  3. 중간 코드를 빌드하세요. 여기서는 구문 트리를 사용했습니다.

  4. 변환 프로그램을 작성하고, 어떤 프로그램에 어떤 문법적 문장이 해당하는지 알아보세요.

어휘 분석:

  1. 정규식을 입력하고 정규식을 nfa->dfa->dfa 최소화로 변환합니다. 이 부분의 경우 Java를 사용하는 NetEase Cloud Classroom 컴파일러로 이동하세요. 이전 nfa 부분에 대해서는 위의 내용을 따르세요.

  2. DFA를 최소화하는 테이블을 가져옵니다. 모든 정규 표현식에 필요한 것은 이 테이블뿐입니다. 따라서 정규식을 결정한 후에는 매번 테이블을 생성하지 않고 바로 테이블을 저장할 수 있습니다.

  3. 그럼 정규 표현식이 많이 필요합니다

    1. 숫자에 하나

    2. 기호에 하나

    3. 키워드에 하나

    4. 변수 이름에 하나

    5. "아무거나 " 하나(오류를 처리하는 데 사용할 수 있습니다. 위의 1-4가 아닌 경우 5를 사용하여 수신하고 제외할 수 있습니다.)

    var id_ = new build_rule();
    id_.build_from_str(id__str, 3);    //这个变量id__str就是那个已经生成字符串保存起来的dfa最小化的表
    //数字3就是id对应的名字,到时候用来判断来生成类型码的

    var key_word = new build_rule();
    key_word.build_from_str(key_word_str, 1);    //和上面一样

    var ops = new build_rule("{op}{op}*", 1);    //这个使用正则生成的规则的,需要经过nfa---dfa---最小化这几步的转化
    //1符号和关键字统称的类型


    var num = new build_rule("{float}", 4);    //同上

    var anything = new build_rule();
    anything.build_from_str(anything_str);
    anything.rule_name = 5;    //这个就是用来处理错误的,识别5这个类型时候就会出错,也可以记录这个出错让程序一直扫描到后面再输出错误

    //按照自己定义的规定的顺序进行添加规则,到时候就会按照这个顺序进行查找
    var qing = qingai(code);
    qing.add_rules(key_word);
    qing.add_rules(id_);
    qing.add_rules(ops);
    qing.add_rules(num);
    qing.add_rules(anything);
    qing.action();
  1. 모든 정규식은 순서가 있으며 사용자에 따라 다릅니다. 자신의 준비가 중요합니다. 예를 들어 주문은 다음과 같습니다.
    변수명——–>키워드————>기타
    이 경우 "var"이 인식되면 var는 변수명으로 간주됩니다. var가 키워드로 정의되지 않은 경우에는 합법적인 변수명으로 사용될 수 있기 때문입니다.
    그래서 순서는 직접 정리해야 합니다

  2. 여러 정규식과 순서를 구성한 후 작업이 시작됩니다.

  3. 소스 코드는 처음부터 스캔되고 메인 포인터는 시작 부분을 가리킵니다

    1. 포인터는 시작 부분을 가리킵니다

    2. 첫 번째 규칙부터 시작

    3. dfa에 따라 오토마톤 규칙, 즉 테이블을 만나면 아무 문자나 만나면 해당 줄로 점프하세요

    4. 다음 문자를 읽은 후에도 여전히 점프할 수 있다면 다른 줄로 점프하세요. 점프할 수 없으면 이 줄에 끝 표시가 있는지 확인하고, 그렇다면 다음 규칙을 찾지 않고 원활하게 종료합니다. 그런 다음 찾은 문자열의 길이를 기본 포인터에 추가하고 이 문자열의 정보를 기록합니다. 행, 해당 열, 어떤 유형인지. 그렇지 않다면 다음 규칙을 찾으십시오.

    5. 모든 사람이 속성을 찾을 수 있도록 보장하는 모든 규칙이 있기 때문입니다.

    6. 공백이나 줄바꿈이 있어서 아직 못찾은 부분도 있으니 마지막에 판단해서 걸러내셔야 합니다.

  4. 그러면 작성한 소스 코드를 기반으로 이러한 테이블을 얻을 수 있습니다

a=7464;b=7465;a=b+7464*2;

자바스크립트를 사용하여 4개의 산술 컴파일러의 어휘 분석 작성 8. 다음의 타입 코드는 이런 종류의 문자열을 문법으로 표현하기 위해 사용해야 하는 타입 코드이다. 나중에 문법 측은 입력된 문장 기호가 주어진 문법에 부합하지 않는지 여부를 결정하기 위해 유형 코드를 사용합니다. 키워드와 기호마다 의미가 다르기 때문에 키워드와 기호의 유형 코드가 다릅니다. 내 변수 이름은 d

단계 요약

  1. 정규식 입력

  2. 매크로 정의 변경 정규식을 일반 문자로 변환

  3. 정규식 잘라내기

  4. 잘라낸 전체 표현식을 nfa 자동 기계에 전달하여 nfa 다이어그램을 구성합니다

  5. nfa 다이어그램 넣기 헤드 노드가 dfa 테이블을 구성하는 dfa 자동화

  6. nfa 테이블을 dfa 최소화하여 dfa 최소화 테이블을 얻습니다

  7. 이렇게 문자열에 해당하는 검색 자동화 구성이 완료됩니다

  8. 1번 반복- 7 모든 정규식이 변환될 때까지. 그 후에는 최소화된 테이블을 모두 저장하고 매번 해당 테이블을 로드하기만 하면 됩니다. 매번 nfa, dfa 등을 생성할 필요가 없습니다.

  9. 규칙을 스캐너에 순서대로 넣고(실제로는 소스 프로그램의 모든 문자를 한 번에 쓰는 while 루프일 뿐입니다) 스캔을 시작합니다.

  10. 토큰 테이블 가져오기

  11. End

관련 기사:

자바스크립트에서 4개의 산술 표현식을 구문 분석하는 알고리즘 및 예

JavaScript 사전 컴파일 원리 분석

위 내용은 자바스크립트를 사용하여 4개의 산술 컴파일러의 어휘 분석 작성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.