programing

무엇이 자바를 C보다 구문 분석하기 쉽게 하는가?

prostudy 2022. 5. 17. 21:54
반응형

무엇이 자바를 C보다 구문 분석하기 쉽게 하는가?

나는 C와 C++의 문법이 문맥에 민감하다는 사실을 알고 있으며, 특히 C의 "독자 해킹"이 필요하다.한편, 나는 두 언어의 상당한 유사성에도 불구하고, 당신이 단지 두 개의 머리 모양 토큰으로 자바를 구문 분석할 수 있다는 인상을 받고 있다.

C에 대해 무엇을 바꾸어야 구문 분석하기 쉽게 만들 수 있을까?

C의 문맥 감수성에 대해 내가 본 모든 예는 기술적으로는 허용되지만 끔찍하게 이상하기 때문에 나는 묻는다.예를 들어,

foo (a);

함수를호출할 수 있음 보이드의 공백을 함수를 호출할 수 있다.foo주장 논박하여와a. 혹은, 또는,선언할 수도 있다를 선언할 수 있다.a형식 타입의 물건이다가 되기 위해 물체이다.foo하지만 괄호도 쉽게 없앨 수 있어.부분적으로는 C 문법에 대한 "직접 선언자" 생산 규칙이 기능과 변수를 모두 선언하는 이중 목적을 충족하기 때문에 이러한 기이함이 발생한다.

반면 자바 문법에는 가변 선언과 함수 선언에 대한 생산 규칙이 따로 있다.만약 니가 쓴다면

foo a;

그리고 그 변수 선언이나그게 가변적인걸 알면서 선언이라는 알고 있다.foo었음을 명확히 typename로 구문 분석할 수 있습니다.분명히 타이피네임으로 구문 분석할 수 있다.이것이 아닐 수도 있어 유효한 코드 클래스 클래스가않은코드일 수 있음 올바르지.foo어딘가에 현재 범위에 있지만, 이후 컴파일러를 건네다 수행할 수 있는 의미 분석에 없는 직업 정의된 적이 없다.현재범위어딘가에서 정의되지 않았지만, 그것은 나중에 컴파일러 패스에서 수행될 수 있는 의미 분석을 위한 작업이다.

나는 C구문 분석하는 데 typedef기가 어렵다고 했지만, 여러분이 자바에 자신만의 형식을 선언하다 볼 수 있습니다.나는 C가 타이페프 때문에 구문 분석하기 어렵다고 말한 것을 보았지만, 자바에서도 당신만의 유형을 선언할 수 있다.어느 C문법 규칙, C외에도 것이 규칙인가 어떤그 외에 문법은?direct_declarator, 잘못?, 잘못되었는가니?

C++를 파싱하는 것은 점점 어려워지고 있다.자바를 분석하는 것은 그만큼 어려워지고 있다.

C(및 C++)가 구문 분석하기 어려운 이유에 대해 설명하는 이 SO 답변을 참조하십시오.간단히 요약하자면 C와 C++ 그램은 본질적으로 모호하다는 것이다; 그것들은 당신에게 여러 파스를 줄 것이고 당신은 모호함을 해결하기 위해 문맥을 사용해야 한다.그러면 사람들은 당신이 구문 분석하는 동안 모호한 부분을 해결해야 한다고 가정하는 실수를 저지른다; 그렇지 않다, 아래를 보라.만약 당신이 구문 분석하면서 애매모호한 것을 해결하자고 고집한다면, 당신의 파서는 더 복잡해지고 그만큼 더 만들기 어려워진다; 그러나 그 복잡성은 자해하는 상처다.

IIRC, 자바 1.4의 "불확실한" LALR(1) 문법은 모호하지 않아 파싱이 "쉬웠다".현대 자바에 적어도 장거리 지역 애매모호한 점이 없는지는 잘 모르겠다; 항상 "..."의 여부를 결정하는 문제가 있다.>>>" 두 개의 템플릿을 닫거나 "우시프트 연산자"이다.현대 자바사는이상 LALR(1)과 구문 분석하지 않는 것 같다.

그러나 두 언어 모두에 대해 강한 파서(또는 현재 C와 C+++ 프런트 엔드처럼 약한 파서 및 컨텍스트 수집 해킹)를 사용함으로써 파싱 문제를 극복할 수 있다.C와 C++는 전처리가 있다는 추가적인 복잡성을 가지고 있다; 이것들은 보기보다 실제적으로 더 복잡하다.한 가지 주장은 C와 C++ 파서가 너무 어려워서 손으로 써야 한다는 것이다.그것은 사실이 아니다; 당신은 GLR 파서 생성기로 Java와 C++ 파서들을 잘 만들 수 있다.

하지만 파싱은 실제로 문제가 있는 곳이 아니다.

일단 구문 분석하면 AST/파스 트리로 뭔가를 하고 싶을 것이다.실제로 모든 식별자에 대해 정의가 무엇이며, 어디에 사용되는지("이름 및 유형 분해능", 느리게, 건물 기호 표)를 알아야 한다.이것은 상속, 인터페이스, 과부하 및 템플릿으로 구성된 파서를 바로 잡는 것보다 훨씬 더 많은 작업으로 밝혀졌으며, 이 모든 것에 대한 의미론들이 언어 표준의 수십에서 수백 페이지에 걸쳐 퍼져 있는 비공식적인 자연 언어로 작성된다는 사실에 의해 혼란스러워졌다.여기 C++는 정말 안 좋아.자바 7과 8은 이런 관점에서 꽤 끔찍해 지고 있다. (그리고 기호 테이블은 당신이 필요한 전부가 아니다; "Life After Parsing"에 대한 더 긴 에세이는 내 바이오를 보라.)

대부분의 사람들은 순수 파싱 부분(흔히 끝나지 않고, 진짜 랭귀지를 위한 작업 파서를 만드는 방법에 대한 많은, 많은 질문들에 대해 SO 자체를 확인함)으로 인해 파싱 후의 삶을 결코 보지 못하게 된다.그리고 나서 우리는 분석하기 어려운 것과 그 이후에 무슨 일이 일어날지에 대한 어떤 신호도 없는 것에 대한 민간적인 이론들을 얻는다.

C++ 구문을 수정해도 아무 소용이 없다.

C++ 구문 변경에 관하여: 당신은 C++ 문법에서 지역적이고 실제적인 모호함을 처리하기 위해 많은 장소를 패치해야 할 것이다.굳이 고집을 부린다면 다음 리스트가 좋은 출발점이 될 도 있다.나는 당신이 C++ 표준 위원회가 아니라면 이것을 하는 것은 의미가 없다고 주장한다; 만약 당신이 그렇게 하고 그것을 이용하여 컴파일러를 만들면, 아무도 그것을 사용하지 않을 것이다.기존 C++ 어플리케이션에 너무 많은 투자를 해서 파서를 만드는 사람들의 편의를 위해 바꾸지는 못한다. 게다가, 그들의 고통은 끝났고 기존 파서들은 잘 작동한다.

당신은 당신만의 파서 쓰기를 원할 수 있다.네, 그게 바로, 당신은 그들이 더 수월해 지기를 사용해야 하는 언어를 변경하게 하기 위해 이 지역의 나머지 것을 기대하지 않는다 괜찮아요.그들은 모두 그것에 가기 쉽고, 이것은 언어로 사용하고 실행해 왔다 기록 사용할 것을 원한다.

참조URL:https://stackoverflow.com/questions/26330425/what-makes-java-easier-to-parse-than-c

반응형