2012-05-16 3 views
2

하나의 간단한 프로그래밍 언어로 렉서를 만들었습니다. 정규 표현식 (Java의 RegEx) 대신 결정론적인 유한 오토마타를 사용합니다. automata는 소스 코드에서 moduleclouds (모듈과 클라우드 모두 키워드 임)를 사용하면 오류를보고하지 않는다는 점을 제외하고는 훌륭하게 작동합니다. 대신 KW_MODULE 및 KW_CLOUDS라는 두 개의 토큰을 만듭니다. 오토 마톤이 KW_MODULE의 최종 상태에 있다면 나는 공백을 미리 볼 수 있다고 주장 할 수있다. 하지만 그것은 문제를 해결하지 못합니다. 왜냐하면 언어에서 토큰 INT DASH INT로 올바르게 번역 될 8-6 (공백으로 구분되지 않음)과 같은 것을 가질 수 있기 때문입니다.유한 오토마타로 구현 된 렉서에서 공백을 처리하는 방법은 무엇입니까?

파서의 문법에서 공백을 처리하는 것은 좋지 않다는 것을 알고 있습니다.

내 자동 완성 기능은 행렬로 구현됩니다 (행은 상태이고 열은 알파벳의 문자이며 셀은 전환 상태 임). 자동 상태가 최종 상태가되면 자동 상태를 시작 상태에서 다시 시작합니다.

이 프로그래밍 언어가 세미콜론을 사용하지 않기 때문에 문제가 있다고 생각합니다. 예 :

모듈; 구름;

대신이 라인을 분리하는 공백을 사용 모듈 구름 미리

감사합니다.

감사합니다.

+2

하지 마십시오. 제발, 당신 ​​같은 프로그래밍 언어로 일해 왔습니다. 새 프로그래밍 언어에 대해 행, 열 또는 공백을 사용하지 말 것을 제안합니다. 프로그래밍 언어 사용자가 어려울 수 있습니다. – umlcat

+0

"이 프로그래밍 언어는 세미콜론을 사용하지 않기 때문에 문제가 발생한다고 생각합니다." 아니요, 당신이 렉서를 잘못 구현했기 때문입니다. 실제로 어셈블러 레벨 이상의 현존하는 모든 프로그래밍 언어는 토큰을 분리하기 위해 공백을 사용합니다. 너는 뭔가 잘못 했어. 당신이 무엇을했는지 모른 채 당신이 잘못한 것을 말하기 란 불가능합니다. – EJP

+0

답장을 보내 주셔서 감사합니다. 내 렉서는 공백을 직접 처리하지 않습니다 (렉서의 알파벳에 공백이 없습니다). 나는 렉서를 단순화하기 위해이 작업을 수행했습니다. 그러나 그것이 나오는대로 그것은 필수입니다. 문제는 일부 토큰이 앞에서 설명한 것처럼 공백을 필요로하지 않는다는 것입니다. 따라서 일부 토큰에는 공백을 포함해야하지만 다른 토큰에는 반드시 공백을 포함시켜야합니다. 예를 들어. KW_ENV를 위해 나는 reg를 만들어야한다. 전의. (환경) 또는 (환경) 및 INT, (INT) 또는 (INT) 또는 (INT) 또는 (INT) 내가 알아낼 수있게 해줘서 고마워. 문안 인사. – greensquare

답변

1

FWIW, 내가 처리 한 파서는 키워드가 문법에 정의 된대로 적절한 식별자이기 때문에이 문제를 처리합니다.

예. 선택적으로 더 많은 문자 또는 숫자가 뒤에 오는 문자로 정의 된 식별자가 있으면 키워드도 해당 금형에 맞아야합니다. lexer는 토큰이 이미 ident로 분류 된 경우에만 잠재적 인 키워드로 간주합니다.

다른 사람들이이 문제를 어떻게 다루는 지 알고 싶습니다.

+0

답장을 보내 주셔서 감사합니다. 무슨 뜻인지는 알지만, 소스 코드에는 환경 (구름, 비행기, 랜딩 필드, 트랙 등을 정의하는 곳)과 소스 코드가 비행기 주변을 돌아 다니면서 나오는 부분이 있습니다. , 식별자 등 ... 그래서 환경에서 어떤 식별자도 없으므로 모듈 클라우드는 식별자로 인식되지 않습니다. – greensquare

관련 문제