intellij-idea
  • grammar
  • intellij-plugin
  • bnf
  • 2017-10-14 3 views 2 likes 
    2

    this 자습서에 따라 IntelliJ Idea에 대한 UnrealScript 언어 (O-style, C 스타일 구문)에 대한 지원을 추가하려고합니다. 그러나 문법 및 렉서 생성에 어려움을 겪고 있습니다. this .bnf 파일 (5 호선)에서IntelliJ 플랫폼 언어 플러그인 개발 관련 질문

    • extends(".*expr")=expr :

      특히,의 목적은 무엇인가?

    • name(".*expr")='expression'this 문서 끝에있는 sample.bnf 파일?

    일단 나는 작동중인 C 스타일의 문법을 갖기 위해 .bnf 파일에 고전적인 C 구문을 적용하고 있습니다. 나는 위에서 언급 한 언어에 따라 그것을 조정할 수 있습니다. Here은 제가 지금까지 해왔 던 것입니다. 나는 this 페이지에서 그것을 적용하고 있는데, 생성기가 지원하지 않는 왼쪽 재귀를 많이 사용하게된다. 따라서 어떻게 다음 규칙을 비 재귀 적으로 변환 할 수 있습니까?

    logical-or-expression ::= logical-and-expression 
             | logical-or-expression '||' logical-and-expression 
    

    약간 더 정교한이 약은 어떻습니까?

    direct-abstract-declarator ::= '(' abstract-declarator ')' 
              | {direct-abstract-declarator}? '[' {constant-expression}? ']' 
              | {direct-abstract-declarator}? '(' {parameter-type-list}? ')' 
    

    그러나이 외에도에서

    , 나는 내가 그렇게 더 일반적으로, 달성하기 위해 노력하고있어 이론의 거대한 부족을 느낄 인 IntelliJ 플랫폼에 언어 지원을 추가하기위한 이론적 전제 조건은 무엇인가 ? 지금까지, 나는 일반적인 bnf/ebnf 표기법으로 만 친숙 해졌다. 용 도서를 읽을 필요가 있습니까? 그렇다면 컴파일러를 작성하지 않으므로 어떤 장을 집중해야합니까?

    답변

    4

    extends(".*expr")=expr 행은 AST 클래스가 생성되는 방식을 변경하여 AST를 더 얕게 만들어 PSI 계층 구조를 더 멋지게 만듭니다. 기본적으로 정규 표현식 .*expr과 일치하는 규칙은 자식이 아닌 expr 규칙을 확장하는 것으로 처리됩니다.

    이것은 예를 들어, add_expr 또는 mul_expr에 대해 생성 된 유형은 Expr 인터페이스를 확장하므로 Expr을 사용할 수있는 곳이면 AddExprMulExpr을 사용할 수 있습니다. 이것이 없다면, ExprAddExpr과`MulExpr, 등등을위한 getter 메소드를 가질 것이다. this section of the HOWTO을 체크 아웃한다.

    name(".*expr")='expression' 행은 "< 표현 >"이 정규 표현식과 일치하는 규칙을 설명하는 데 사용됨을 의미합니다. 이것은 주로 오류 메시지에 나타납니다 - "< 표현 > 예상, XX"입니다. 모든 변형을 나열하는 대신 모든 표현식 규칙을 이름과 함께 그룹화하는 것이 유용합니다.

    불행히도 다른 질문에 대해서는 많은 조언을 드릴 수 없습니다. GrammarKit은 section on parsing expressions에 설명 된대로 왼쪽 재귀를 지원하지만 실제로 세부 사항을 알지 못합니다. 그 외에는 왼쪽 재귀 규칙을 다시 작성할 수 있으므로이를 수행하는 방법의 예를 검색하는 것이 가장 좋습니다.

    마찬가지로, 나는 파서 작성에 대한 자습서를 찾고 가능한 한 많이 읽는 것이 좋습니다. IDE 용 파서를 작성하는 방법에 대해서는 거의 쓰여 있지 않지만, 컴파일러 용 파서와 IDE를 작성하는 것의 큰 차이점은 오류 처리입니다.IDE는 코드가 항상 손상되었다고 가정해야합니다 (일반적으로 입력 할 때이므로) 정상적으로 복구해야합니다. 마찬가지로 AST의 디자인은 중요하지만 이에 대한 지침은 없습니다. 본질적으로 요구 사항에 따라 달라집니다. 작성중인 기능에 맞게 문법 및 AST 구조를 조정할 준비를하십시오.

    관련 문제