Sylver 시작하기 - 3부/3부: 쿼리에서 분석기로

Part1 및
Part2의
시리즈에서 우리는 언어 사양을 구축하는 방법과 Sylver의 쿼리 언어를 사용하여 JSON 문서의 구문 분석 트리를 탐색하는 방법을 배웠습니다.

소스 코드 쿼리를 통해 코드베이스를 대화식으로 탐색하는 것이 통찰력이 있을 수 있지만 소스 코드 확인을 수행하는 가장 실용적인 방법은 아닙니다. 이 자습서에서는 마지막 부분에서 빌드한 쿼리를 규칙 집합으로 패키징하여 린터와 같은 방식으로 사용하는 방법을 배웁니다.
sylver를 이미 설치했는데 sylver --version가 출력되지 않는 경우
버전 번호가 >= 0.1.4인 경우 https://sylver.dev으로 이동하여 소프트웨어의 새 사본을 다운로드하십시오.

전주곡



지난 튜토리얼의 두 파일을 재사용합니다.
  • json.syl

  • node JsonNode { }
    
    node Null: JsonNode { }
    
    node Bool: JsonNode { }
    
    node Number: JsonNode { }
    
    node String: JsonNode { }
    
    node Array: JsonNode { 
        elems: List<JsonNode> 
    }
    
    node Object: JsonNode {
        members: List<Member>
    }
    
    node Member: JsonNode {
        key: String,
        value: JsonNode
    }
    
    term COMMA = ','
    term COLON = ':'
    term L_BRACE = '{'
    term R_BRACE = '}'
    term L_BRACKET = '['
    term R_BRACKET = ']'
    term NULL = 'null'
    
    term BOOL_LIT = `true|false`
    term NUMBER_LIT = `\-?(0|([1-9][0-9]*))(.[0-9]+)?((e|E)(\+|-)?[0-9]+)?`
    term STRING_LIT = `"([^"\\]|(\\[\\/bnfrt"])|(\\u[a-fA-F0-9]{4}))*"`
    
    
    ignore term WHITESPACE = `\s`
    
    rule string = String { STRING_LIT }
    
    rule member = Member { key@string COLON value@main }
    
    rule main =
        Null { NULL }
      | Number { NUMBER_LIT }
      | Bool { BOOL_LIT }
      | string
      | Array { L_BRACKET elems@sepBy(COMMA, main) R_BRACKET }
      | Object { L_BRACE members@sepBy(COMMA, member) R_BRACE }@
    

  • invalid_config.json

  • {
        "variables": [
            {
                "name": "date of birt`",
                "description": "Customer's date of birth",
                "type": "datetime"
            },
            {
                "name": "activity",
                "description": "A short text describing the customer's profession",
                "type": "string"
            },
            {
                "name": "country",
                "description": "Customer's country of residence",
                "type": "string",
                "values": ["us", "fr", "it" ]
            }
        ]
    }
    
    

    REPL에서 벗어나기


    규칙 세트 만들기



    이전 튜토리얼의 규칙을 재사용 가능한 규칙 세트로 패키징하는 것은 다음과 같이 간단합니다.
    다음YAML 파일 생성:

    id: 'JSON ruleset'
    language: json.syl
    
    rules: 
      - id: variable_length
        message: Variable name is too long
        severity: warning
        query: >
          match String desc when desc.text.length > 37 && desc.parent is {
            Member m when m.key.text == '"description"'
          }  
    
      - id: variable_format 
        message: Variable name isn't a lowercase word
        severity: info
        query: >
          match String s when !s.text.matches(`"[a-z]+"`) && s.parent is {
            Member m when m.key.text == '"name"'
          }    
    
      - id: types_or_values
        message: Fields 'type' and 'values' are mutually exclusive    
        severity: error
        note: The type can be deduced from the values list.
        query: >
          match Object n when
            any n.members.children match {  
                Member m when m.key.text == '"type"' 
            }
            && any n.members.children match { 
                Member m when m.key.text == '"values"' 
            }
    


    여기서 id는 사람이 읽을 수 있는 규칙 세트 설명이고 language는
    언어 사양 파일.

    다음 속성은 규칙 세트를 구성하는 개별 규칙을 설명합니다.
  • id: 규칙의 고유하고 짧은 이름
  • 메시지: 문제에 대한 간결한 설명
  • 심각도: 오류, 정보 또는 경고
  • 쿼리: 인라인 쿼리
  • 참고: 선택적 추가 정보

  • 규칙 세트 파일이 ruleset.yaml라고 가정하면 다음 명령을 호출하여 현재 디렉토리의 모든 .json 파일에서 이 규칙 세트를 실행할 수 있습니다.

    sylver ruleset run --files "*.json" --rulesets ruleset.yaml
    


    프로젝트 구성 저장



    여러 규칙 세트에 대해 코드베이스의 유효성을 검사하려면 위의 내용을 반복합니다.
    모든 규칙 세트에 대한 명령은 지루할 수 있습니다. 대신 프로젝트 구성을 작성할 수 있습니다.
    프로젝트 루트에 있는 sylver.yaml 파일에서:

    subprojects:
      - language: json.syl
        rulesets: ['ruleset.yaml']
        include:
          - './**/*.json'
    


    구성에는 각각 언어가 있는 하위 프로젝트 목록, 선택적 규칙 집합 목록 및 포함할 파일 목록이 포함됩니다.
    sylver check를 호출하면 sylver.yaml에서 구성을 읽고 다음을 실행합니다.
    지정된 규칙 세트.

    힘내 통합



    여러 프로젝트에서 언어 사양 또는 규칙 세트를 재사용하려는 경우 모든 프로젝트에서 .syl 및 .yaml 파일을 복사하는 것이 불편할 수 있습니다. 운 좋게
    규칙 세트 및 프로젝트 구성은 git 저장소에 저장된 아티팩트를 참조할 수 있습니다.

    이 자습서의 언어 사양 및 규칙 세트는 this repo에 업로드되었으므로 sylver.yaml 구성 파일을 다음과 같이 다시 작성하면 됩니다.

    subprojects:
      - language: 
          repo: https://github.com/geoffreycopin/getting_started_json_tutorial
          file: json.syl
        rulesets: 
          - repo: https://github.com/geoffreycopin/getting_started_json_tutorial
            file: 'ruleset.yaml'
        include:
          - './**/*.json'
    


    언어 사양 및 규칙 세트는 .sylver 디렉토리에 자동으로 복제됩니다.
    실행할 때sylver check .

    결론



    이제 JSON 구성 파일에 대해 재사용 가능한 린터가 있습니다.
    Sylver의 DSL을 사용하여 스크래치.

    다음 자습서에서는 사전 빌드된Golang을 사용하여 범용 Go 린터를 작성합니다.

    좋은 웹페이지 즐겨찾기