1 년 전 제가 참석 한 대학에서 학기 프로젝트를 진행했습니다. 여기서 우리는 프로그래밍 언어를 작성해야했습니다. 그룹으로서 우리는 파서를 처음부터 손으로 쓸 수 있기를 원했기 때문에 그렇지 않으면 파서를 작성하는 것이 완전히 비현실적이었을 것이므로 LL (1) 문법을 목표로해야했습니다.
물론 우리 출발점은 LL (1)과 거리가 멀었습니다. 그래서 우리도 그것을 배치해야했습니다. 이를 위해 AtoCC 패키지의 kfgEdit 도구를 사용했습니다. 당신이하는 일은 당신의 규칙을 입력하는 것입니다, 그리고 그것은 그것이 LL (1) 문법인지를 한 번의 클릭으로 확인할 수 있습니다.
경고의 좋은 단어 : 도구는 받아 들일 수있는 것에 대해 약간 까다 롭습니다. 실제 문법에 자주 EBNF를 사용하기 때문에 작성할 수 있습니까? * 및 +는 토큰이 표시되어야하는 횟수를 나타냅니다. 이는 지원되지 않습니다. 그룹화는 지원되지 않습니다. 아주 오래 걸리는 것을 발견 할 수 있습니다. LL (1)에 도달 한 후에는 "재배치"를하고 싶을 것입니다.
물론 당신이 다루는 문법의 유형에 따라, 이것은 당신에게별로 문제가되지 않을 수도 있습니다. 상당히 제한된 구조 (프로 시저, 함수, 기본 내장 된 기본 유형 및 배열, ifs, 단일 루프 구조로 우리는 대신 자신을 생각해 냈습니다.)를 사용하여 일종의 Pascal/C 하이브리드를 만들었습니다. 표준 3 ...), LL (1) 문법 - 아마 2, 아마도 그것을 논쟁하는 데 적어도 일주일이 걸렸습니다. 이것은 약 4 개월의 합계가 아니므로 거기에 많은 시간을 보냈습니다.
LL (1) 문법이 반드시 필요한 경우에는 다음과 같은 상황이 발생하면 분명히 버튼을 눌러야하지만 yacc/bison이나 SableCC와 같은 파서 생성기를 사용할 수 있다면 당신은 장기적으로 볼 때 그 경로를 따라 가기가 훨씬 쉽다는 것을 알게 될 것입니다. 그건 당신이 그 길을 따라 가야한다는 것을 의미하지는 않습니다. 실제로 손으로 모든 것을 쓰는 것이 통찰력을 제공한다는 것을 알았습니다. 그렇지 않으면 얻지 못할 가능성이 있습니다. 그러나 현재 상황과 다른 상황에서 그 통찰력을 얻는 것이 더 나을 수도 있습니다. .
tl; dr 버전 : AtoCC 패키지의 kfgEdit를 사용하십시오.
kfgEdit는 모든 비 단말기에 대한 첫 번째 세트를 계산하지만 가능한 충돌이 발생할 수있는 위치에 따라 일부 후속 세트 만 계산합니다. 즉, 문법 논쟁에서 여전히 귀중한 것이 었습니다. 감사! – Zxaos