자바 CC 를 이용 하여 생 성기 구현 에 실 패 했 습 니 다.

회사 안에 사용자 정의 프로 토 콜 이 있 습 니 다.서버 는 C++로 작성 되 었 고 제 작업 은 자바 와 이 서버 를 통 해 통신 되 었 습 니 다.프로 토 콜 주체 의 해석 은 C+의 소스 파일 에서 정 의 된 구조 체 를 참고 하여 분석 하 는 것 입 니 다.다음 과 같 습 니 다.
typedef struct ExSecFreeTxtGroup
{
 	unsigned char cHeader;
 	unsigned char cGroupLen;
 	unsigned long sStockCd;
 	char cFreeTxt[2][20];
} ExSecFreeTxtGroup;

 
이러한 구조 체 가 비교적 많 기 때문에 회사 에서 이전에 도 유사 한 해석 류 를 중용 할 수 있 었 지만 폐단 도 있어 현재 준비 한 새로운 프로젝트 의 확장 에 불편 을 겪 었 다.그래서 이런 종 류 를 다시 쓰기 로 했 지만 너무 많 고 주체 부분의 해석 은 중복 작업 이 므 로 자동 으로 생 성 될 수 있다 는 것 을 의미한다.그래서 자바 CC 를 통 해 자바 파일 생 성 을 해석 하 겠 다 는 생각 이 들 어 이틀 을 봤 다.결국 성공 하 지 는 못 했 지만,적어도 자바 CC 의 용법 은 알 게 되 었 다.
 
다음은 제 가 작성 한 jj 파일 입 니 다.구조 체 에 대한 문법 분석 과 제 가 원 하 는 키 워드 를 간단하게 실현 하고 주석 과'\#'에서 시 작 된 매크로 정 의 를 제외 합 니 다.
options {
  LOOKAHEAD = 1;
  CHOICE_AMBIGUITY_CHECK = 2;
  OTHER_AMBIGUITY_CHECK = 1;
  STATIC = false;
  DEBUG_PARSER = true;
  DEBUG_LOOKAHEAD = true;
  DEBUG_TOKEN_MANAGER = false;
  ERROR_REPORTING = true;
  JAVA_UNICODE_ESCAPE = false;
  UNICODE_INPUT = false;
  IGNORE_CASE = false;
  USER_TOKEN_MANAGER = false;
  USER_CHAR_STREAM = false;
  BUILD_PARSER = true;
  BUILD_TOKEN_MANAGER = true; 
  SANITY_CHECK = true;
  FORCE_LA_CHECK = false;
}





PARSER_BEGIN( Std3Parser )
package mislay.util;

import java.util.*;
import mislay.util.std3parser.*;
import mislay.util.std3parser.Std3StructMetaInfo.RowType;
public class Std3Parser {
	private Map<String,Std3StructMetaInfo> structs = new HashMap<String,Std3StructMetaInfo>();
	private Std3StructMetaInfo getStruct(String typeName) {
		Std3StructMetaInfo metaInfo = structs.get(typeName);
		if(metaInfo == null) {
			structs.put(typeName,metaInfo = new Std3StructMetaInfo());
			metaInfo.setTypeName(typeName);
		}
		return metaInfo;
	}
	
	public Map getStructs() {
		return structs;
	}
}
PARSER_END( Std3Parser )
void start() : {}             
{ 
	struct()
}

void struct() : 
{
} 
{ 
	("typedef""struct"structType())*<EOF>
}
  
void structType() :
{
	Token typeName = null;
	Token typeAlias = null;
}
{
	typeName = <IDENTIFIER>
	<LBRACE>(row(typeName.image))+<RBRACE>
	typeAlias = <IDENTIFIER>
	<SEMICOLON>
	{
		Std3StructMetaInfo metaInfo = getStruct(typeName.image);
		metaInfo.setTypeAlias(typeAlias.image);
	}
}

void row(String typeName):
{
	Token unsigneds = null;
	Token type = null;
	Token name = null;
}
{
	[unsigneds = "unsigned"]
	(type = "char" | type = "int" |type = "long" | type = "double" | type = <IDENTIFIER>)
	name = <IDENTIFIER>
	(<ROWNAME>)*
	<SEMICOLON>
	{
		Std3StructMetaInfo metaInfo = getStruct(typeName);
		RowType rowType = null;
		try {
			rowType = RowType.valueOf(type.image.toUpperCase());
		} catch(Exception e) {
			rowType = RowType.REF;
		}
		metaInfo.addRow(unsigneds == null,rowType,name.image);
	}
}
SKIP 	: 
{
	" "
|	"\t"
|	"
" | "\r" | <"//" (~["
","\r"])* ("
" | "\r" | "\r
")> | <"/*" (~["*"])* "*" ("*" | ~["*","/"] (~["*"])* "*")* "/"> | <"#" (~["
","\r"])* ("
" | "\r" | "\r
" )*> } TOKEN : { < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* > | < #LETTER: ["$","A"-"Z","_","a"-"z"] > | < #DIGIT: ["0"-"9"] > } TOKEN : { < LPAREN: "(" > | < RPAREN: ")" > | < LBRACE: "{" > | < RBRACE: "}" > | < LBRACKET: "[" > | < RBRACKET: "]" > | < SEMICOLON: ";" > | < COMMA: "," > | < DOT: "." > | < ROWNAME: "["(["0"-"9"])+"]" > }

 진지 하 게 보면.jj 파일 의 구조 가 매우 간단 하 다 는 것 을 알 수 있 습 니 다.BNF 를 제외 하고 나머지 는 자바 의 실현 입 니 다.그러나 최종 적 으로 완성 되 지 않 은 것 은 BNF 의 작성 이 너무 복잡 하기 때 문 입 니 다.어떤 읽 기 는 순서대로 끝까지 읽 는 것 이 아니 라 규칙 적 인 것 입 니 다.예 를 들 어 몇 개의 필드 가 반복 적 으로 몇 번 읽 거나 특정한 필드 의 길이 로 반복 적 으로 읽 는 것 입 니 다.전체 구조의 길이 가 끝 날 때 까지 순환 하 는 등 유형 적 인 문제 도 있다.예 를 들 어 char[]는 일반적으로 문자열 을 읽 지만 어떤 것 은 그렇지 않다.그래서 저 는 이러한 조건 을 위해 이 구 조 를 바탕 으로 특별한 주 해 를 추가 하여 특정한 규칙 을 표시 해 야 합 니 다.예 를 들 어@Loop(type=serial,length=32).물론.jj 파일 에 BNF 표현 식 을 추가 해 야 합 니 다.그리고 조건 이 비교적 많 습 니 다.이런 BNF 를 쓰 는 것 은 이틀 밖 에 접촉 하지 못 한 저 에 게 도전 입 니 다.헤헤,차라리 잠시 내 려 놓 으 세 요.시간 관 계 는 잠시 여기에 표 시 를 남 겨 두 세 요.나중에 시간 나 면 주 워.
 
뒷말:특정 상황 만 을 고려 하여 자바 CC 를 이용 하 는 것 은 간단 합 니 다.모든 상황 을 고려 하여.jj 파일 을 작성 하 는 것 은 정말 도전 입 니 다.그러나 비교적 전면적 인 상황 을 고려 하지 않 으 면 자바 CC 를 이용 하지 않 을 것 입 니 다.정규 표현 식 을 이용 하 는 것 이 편리 하고 빠 를 수 있 습 니 다.
 
컴 파일 원리 에 대해 알 고 있 으 면 더욱 쉬 울 것 이다.그리고 여기 서 말 하 는 BNF 는 표준 BNF 가 아 닙 니 다.

좋은 웹페이지 즐겨찾기