자바 CC 를 이용 하여 생 성기 구현 에 실 패 했 습 니 다.
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 가 아 닙 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java swing drawImagegetImage 가 즉시 돌아 오기 때문에 그림 이 불 러 올 때 까지 기다 리 지 않 고 프로그램 에서 다른 작업 을 수행 할 수 있 습 니 다.성능 을 향상 시 킬 수 있 지만 효과 적 인 프로그램 은 더 많은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.