저는 현재 학사 프로젝트의 일환으로 포커 손 역사 파서를 연구 중입니다. 저는 지난 며칠 동안 약간의 연구를 해왔고 몇 가지 훌륭한 파서 생성기를 보았습니다 (프로젝트 자체는 Java로 코딩되기 때문에 JavaCC를 선택했습니다).문법 모호성 처리 (포커 파일 파싱)
핸드 히스토리 문법이 매우 기본적이고 간단하지만, 플레이어의 닉네임에 허용 된 문자 집합으로 인해 모호성 문제가 있습니다. 가정하자
우리는 다음과 같은 형식의 라인을 가지고 :
Seat 5: myNickname (1500 in chips)
토큰 myNickname
모든 문자뿐 아니라 공백을 포함 할 수 있습니다. 즉, (1500 in chip
과 Seat 5:
이 유효한 별명이므로 궁극적으로 모호성 문제가 발생합니다. 길이 (4-12 자)를 제외하고는 플레이어의 닉네임에 대한 제한이 없습니다.
여러 데이터를 플레이어의 닉네임 (예 : 좌석 위치 및 칩 개수)과 함께 구문 분석하고 저장해야하므로 제 질문은 여기에 어떤 옵션이 있습니까?
나는 그것이 JavaCC에,이 따라 뭔가 사용 할 싶어요 :
SeatRecord seat() :
{ Token seatPos, nickname, chipStack; }
{
"Seat" seatPos=<INTEGER> ":" nickname=<NICKNAME> "(" chipStack=<INTEGER>
"in chips)"
{
return new SeatRecord(seatPos.image, nickname.image, chipStack.image);
}
}
가 어느 지금
가 나는 또한 GLR 파서 주위를 검색 (때문에 언급 한 문제에) 작동하지 않습니다 (분명히 모호한 문법을 다루고 있음) -하지만 그들은 주로 Bison을 제외하고는 버려지거나 문서화가 잘 안되는 것 같지만 Java 용 GLR 파서를 지원하지 않으며 너무 복잡하여 어리석은 문제를 제외하고는, 내가 말했듯이, 문법 자체는 꽤 기초적이다.)
또는 문자열을 직접 토큰 화해야하고, 필요한 데이터를 구문 분석하기 위해 indexOf(), lastIndexOf()
등을 사용해야합니까? 그것이 남아있는 유일한 선택이었다 경우에만 너무 추한 이럴 것 때문에 나는 그것을 위해 갈 것이라고 나는 (잘못된 해석으로 이어질 것입니다) 어떤 경우
각 "기능"이 coloum이고 각 행이 seatRecord 인 2 차원 어레이에 저장하는 것은 어떻습니까? 각 부분을 문자열로 처리하고 사용자 정의 구분 기호 (어쩌면 일부 불분명 한 유니 코드 문자)를 추가하여 이름을 다듬지 않아도됩니다. – Azulflame