2010-01-23 3 views
1

나는 구문 분석 할 필요가있는 소프트웨어로부터 (독점적 인) 결과를 얻었다. 안타깝게도 이스케이프 처리되지 않은 사용자 이름이 있으며 BNF (또는 EBNF 또는 ABNF)를 사용하여 구문 분석해야하는 파일을 설명 할 수 있는지 여부를 알기 위해 머리카락을 긁어 모으고 있습니다.이스케이프 처리되지 않은 사용자 이름이 BNF와 호환되지 않습니까?

문제, (정말 그냥 예입니다) 과도하게 단순화, 다음과 같이 보일 수 있습니다 :

(데이터) :: = < 이름 >
< 이름 > :: = (다른 데이터 타입)

어떤 경우에는 왼쪽 또는 오른쪽에 표시하는 대신 사용자 이름을 줄 중간에 표시 할 수도 있습니다.

문제는 사용자 이름이 이스케이프 처리되지 않고 사용자 이름에 제한이 없다는 것입니다. 인쇄 가능한 ASCII이며 최대 20 자이며 줄 바꿈을 포함 할 수 없습니다. 따라서 "="는 완벽하게 유효한 사용자 이름입니다 (예 :). 그리고 "= 1 = john = 2"(왜냐하면 사인 온시 사용자가 원하는 사용자 이름을 선택할 수있는 위치에 있기 때문에 출력에 이스케이프되지 않은 문자가 나타납니다).

내 파서가 매우 독창적 인 사용자 이름을 맹렬히 비난했기 때문에 묻습니다. (다시 한번 내 통제가 아니라 "이상한"이며 이에 대처해야합니다) 나는 쉽게 대처할 방법을 찾을 수 없습니다. 이. 또한 사용자 이름을 미리 알지 못합니다 (예를 들어 사용자가 만든 모든 사용자 이름을 포함하는 데이터베이스에 액세스 할 수 없음).

그래서 제한되지 않고 이스케이프되지 않은 사용자 이름이 BNF와 호환되지 않습니다?

P.S : 나는 실수를 만든 경우에 유래 : 내 첫 번째 게시물입니다, 나와 함께 멋진

+0

사용자 이름이 언제 끝나는 지 어떻게 알 수 있습니까? –

+0

@ Jason : 그 점이 다소 의문입니다. 입력을 정의하지 않았습니다. BNF/토크 나이저 방식을 사용하여 사용자 이름의 끝에 토큰을 실수 한 경우도 있고 반대의 경우도 있습니다.Eli와 mcdowella는 다음과 같이 대답했습니다. 기본적으로 BNF와 원하는 사용자 이름을 선택할 수있는 기능을 제공합니다. – SyntaxT3rr0r

답변

1

BNF가하는 당 자체 사용자 이름 없음 "주의". 이것은 토큰 레벨에서 작동합니다. username 토큰을 정의하면이를 토대로 BNF를 사용하여 문법을 설명 할 수 있습니다.

문제는 렉서 레벨에서 해결해야합니다. 렉서는 심지어 이스케이프 처리되지 않은 경우에도 사용자 이름을 인식 할 수있을만큼 똑똑해야하며 username 토큰을 파서에 전달해야합니다.

이론적으로 모든 종류의 사용자 이름을 문법으로 설명 할 수 있지만 언어의 다른 것들에 크게 의존합니다. =은 유효한 토큰입니까? 그렇다면 사용자 이름에 =이 있는지 어떻게 구분할 수 있습니까? 더 자세한 답변을 얻으려면 나머지 규칙과 유효한 토큰을 해당 언어로 설명해야한다고 생각합니다.

+0

같은 줄에 다른 토큰이 있거나 사용자 이름에 파서가 토큰으로 간주하는 내용이 포함되어있는 경우 문제가 발생합니까? –

+0

@ 엘리 : 그래, 내 질문에 충분하게 공식화되지 않았다. 우리는 토큰화할 때 문제가있다. 렉서는 항상 사용자 이름을 인식 할 정도로 똑똑 할 수 있습니까? 기본적으로 모든 사용자 이름이 유효하다는 것을 알고 있습니까? 사용자가 의도적으로 렉서를 깨뜨릴 수있는 이름을 사용할 것이라고 상상해 봅시다. 사용자가 사용자 이름에 전혀 제한을 두지 않으면 언제든지이를 해결할 수 있습니까? – SyntaxT3rr0r

+0

@Paul : 그래, 내 질문의 요지이다. – SyntaxT3rr0r

1

사용자 이름이 아닌 것을 인식 한 다음 왼쪽에서 오른쪽으로 구문 분석하는 대신 오른쪽에서 왼쪽으로 구문 분석하거나 동등하게 편심하여 해석하는 경우에도 사용자 이름 대신 다른 모든 사용자 이름을 선언하여 작업하는 것이 가능할 수 있습니다.

입력 내용이 실제로 모호한 지 알아 보는 것이 좋습니다. 동일한 출력이 생성되는 두 가지 상황을 찾을 수 있습니까? 그렇다면, 당신은 돌아가서 그들이 호의적 인 것을 요구하거나, 어떤 종류의 오류가 생길지 등을 결정해야합니다. 그렇지 않다면 왜 파서 나 렉서가 무엇을해야 하는지를 알아내는 데 도움이되지 않습니다.

+0

@mcdowella : 그렇습니다. 정확하게 "괴상한"파싱을 의미했습니다. 나는 기본적으로 LR 파서, RL 파서 및 "외부에서 내부"파서 (왼쪽에 하나의 문자를 파싱하고, 오른쪽에 하나씩 파싱 한 다음 각 라인의 중심을 향해 진행)를 사용했다. 내가 가진 입력의 종류 (다시 한번 입력 형식은 제 제어가 아닙니다). 하지만 나는 여기에서 "내가 보는 것"이 ​​아닌지 확인하기 위해 질문을했습니다. 나는 BNF/토크 나이저 방식을 포기하고 그런 경우에 간단히, 잘 작동하는지 확인하기를 원했습니다. 답장을 보내 주셔서 감사합니다. :) – SyntaxT3rr0r

관련 문제