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 린터를 작성합니다.

    좋은 웹페이지 즐겨찾기