내 프로그램 중 하나는 런타임에 명령 (예 : kill foo
)을 허용합니다. 도메인 별 언어로 생각하면됩니다. 다음은 몇 가지 예입니다 :C에서 DSL을 파싱하기위한 lex/yacc보다 나은 솔루션?
kill
kill client
exit
뿐만 아니라, 체인 명령이 허용 공백 전과 명령 후 중요하지 않습니다있다, 그래서 다음 예는 유효합니다
kill ; say "that was fun"
kill ; kill ; kill;
나는 현재이 구현 렉스/yacc (플렉스/들소 특정)와 두통이 많이 발생합니다. 렉서는 문맥에 크게 의존합니다 (예를 들어, 공백 토큰은 일반적으로 kill
키워드 이후에 반환되지 않는 한 반환되지 않음). 그리고 여러 가지 상태가 있습니다. 문법은 충돌을 일으키기 때문에 필자는 ($ 1, $ 2, $ 3, ... 비 터미널에 대한 인수를 사용하는) 특히 지정해야하는 형식을 좋아하지 않습니다. 또한 bison이 제공하는 오류 메시지 (구문 분석시)는 정확하지만 때로는 정확하지 않은 경우가 종종 있습니다. (옵션 인수가있는 kill
명령은 kill client
대신에 의 경우 Unexpected $undefined, expected $end or ;
과 같은 오류 메시지를 표시합니다). 마지막으로 yacc의 C API는 잔인합니다 (외부에서 정의 된 외부).
위의 질문을 모두 풀어 줄 것을 요구하지는 않습니다. lex/yacc 주위에 방법이 없으면 좀 더 구체적인 설명과 코드로 별도의 스레드를 열어 볼 것입니다. 대신 lex/yacc의 대안에 관심이 있습니다.
- 입력 문자열 (const를 숯불 *)이며, 거기에는 출력되지 않습니다 대신 몇 가지 코드가 각기 다른 키워드를 호출해야합니다 :
내 기준은 다음과 같습니다.
- C (C99)와 함께 사용하고 싶습니다.
- 소프트웨어는 이미 주요 Linux 배포판에 포함되어 있거나 최소한 번들/패키지로 묶여 있어야합니다.
- 잘 문서화되어야합니다.
- 내 언어를 설명하는 구문은 쉽습니다.
- 구문 분석 오류시 의미있는 오류 메시지를 출력해야합니다.
- 성능은 그다지 중요하지 않습니다 (당연히 빠르지 만 일반적인 사용 사례는 대용량의 MB 명령을 처리하지 않는 대화식 사용입니다).
살생, 죽이기, 살해! – Philip
@Philip : 예, 당신은 모든 렉서/파서 물건을 망친 후에 가지고있는 느낌을 얻습니다. :) – Michael