ocamllex 매뉴얼을 참조로 여유 시간에 Lua fslex 렉서에서 작업했습니다.fslex의 Lua 긴 문자열
긴 문자열을 올바르게 토큰 화하는 동안 약간의 장애가 발생했습니다. "긴 문자열"은 '[' ('=')* '['
및 ']' ('=')* ']'
토큰으로 구분됩니다. =
기호의 수가 동일해야합니다.
[=[
및 변형 반면, 가장 긴 경기 규칙에도 불구하고 두
LBRACKET
토큰을 생성
[[
패턴을 인식하지 보였다. 또한 정규 표현식은 올바른 긴 토큰 "level"과 상관없이 첫 번째
']' ('=')* ']'
캡처에서 멈추는 올바른 닫기 토큰이 사용되었는지 확인하지 못했습니다. 또한 fslex는 정규 표현식에서 "as"구문을 지원하지 않는 것 같습니다.
let lualongstring = '[' ('=')* '[' (escapeseq | [^ '\\' '[' ])* ']' ('=')* ']'
(* ... *)
| lualongstring { (* ... *) }
| '[' { LBRACKET }
| ']' { RBRACKET }
(* ... *)
나는 렉서의 다른 규칙과 문제를 해결하기 위해 노력했습니다 :
rule tokenize = parse
(* ... *)
| '[' ('=')* '[' { longstring (getLongStringLevel(lexeme lexbuf)) lexbuf }
(* ... *)
and longstring level = parse
| ']' ('=')* ']' { (* check level, do something *) }
| _ { (* aggregate other chars *) }
(* or *)
| _ {
let c = lexbuf.LexerChar(0);
(* ... *)
}
그러나 나는 두 가지 이유, 붙어 : 첫째, 나는 내가 할 수있는 생각하지 않는다 " 말하자면 긴 문자열을 읽은 후 다음 규칙에 대한 토큰을 넣으십시오. 둘째로, 나는 현재 닫혀있는 토큰이 발견 될 때까지 char에 의해 char을 읽는 아이디어를 좋아하지 않으므로 현재의 디자인을 쓸모 없게 만든다.
어떻게 LUA 긴 문자열을 fslex로 토큰화할 수 있습니까? 읽어 주셔서 감사합니다.
Offhand, 그냥 언급하고 싶었 : 당신은 항상 그것을 렉스보다 구문 분석하도록 선택할 수 있습니다. – Brian
@ 브라이언, 좀 자세히 설명해 주시겠습니까?:) 나는 원래 긴 문자열을 생성하기 위해 관련없는 토큰 시퀀스를 파싱하는 방법을 이해하려고 노력하면서 손실을 조금 겪고 있습니다. 렉서가 문자열의 모든 내용에 대해 토큰을 생성 할 수 있다면 말입니다. 귀하의 의견에 감사드립니다. – Raine
그래, 좋은 전략은 아닐거야, 그냥 던져 버릴 뿐이야. – Brian