스택 기반 언어 토큰 화


15

나는 작업을했습니다 다른 호출 스택 기반의 골프 언어 Stackgoat . 이 과제에서는 Stackgoat (또는 실제로는 일반적인 스택 기반 언어) 용 Tokenizer를 작성하게됩니다.

"PPCG"23+
["PPCG", '23', '+']

'a "bc" +
['"a"', '"bc"', '+']

12 34+-"abc\"de'fg\\"
['12', '34', '+', '-', '"abc\"de'fg\\"']

"foo
['"foo"']

(empty input)
[]

' ""
['" "', '""']

사양

처리해야 할 세 가지 유형은 다음과 같습니다.

  • 문자열, 아무것도""
  • 숫자, 모든 자릿수
  • 연산자, 공백 이외의 다른 단일 문자

공백은 문자열 내에 있거나 두 숫자를 분리하지 않으면 본질적으로 무시됩니다.

문자열 / 문자 사양 :

  • 문자열은로 구분됩니다 "하고,이 때 \발생, 다음 문자는 이스케이프해야합니다.
  • 문자 앞에 a가 붙어 있고 '뒤에 나오는 문자 '는 문자열 리터럴로 변환되어야합니다. 'a->"a"
  • ' 항상 그 뒤에 문자가 있습니다
  • 닫는 따옴표는 자동 삽입되어야합니다

규칙 :

  • 어떤 형태 eval도 허용 되지 않습니다

입출력:

  • STDIN, 함수 매개 변수 또는 해당 언어를 통해 입력 할 수 있습니다.
  • 출력은 배열이거나 해당 언어와 가장 비슷한 것이어야합니다.

5
@Doorknob, 진심으로?
LegionMammal978

4
@ LegionMammal978 그렇습니다.
Alex A.

1
STDOUT으로 출력 할 수 있습니까?
Doorknob

2
@ZachGates 예, 대부분의 언어는 \를 이스케이프 문자로 취급하므로 언어가 분명히 필요한 경우 이스케이프해야합니다.
Downgoat

1
또한, 제 실시 예에서, 결과의 첫 번째 요소가되어야 '"PPCG"'대신으로 "PPCG"?
기금 모니카의 소송

답변:


8

망막 , 68 64 63 바이트

M!s`"(\\.|[^"])*"?|'.|\d+|\S
ms`^'(.)|^"(([^\\"]|\\.)*$)
"$1$2"

또는

s`\s*((")(\\.|[^"])*(?<-2>")?|'.|\d+|.)\s*
$1$2¶
\ms`^'(.)
"$1"

나는 이것이 도전의 테스트 케이스에서 다루지 않은 모든 펑키 에지 케이스를 포괄한다고 생각합니다.

온라인으로 사용해보십시오!


댕, 이건 짧아 잘 했어요!
Fund Monica의 소송

이것을 95 바이트 ES6 함수로 변환 할 수있었습니다. 정규 표현식이 다른 방식으로 작동하지 않는다는 점을 제외하고는 80 일 것입니다 (너무 많은 경우).
Neil

2

루비, 234 바이트

puts"[#{$stdin.read.scan(/("(?:(?<!\\)\\"|[^"])+(?:"|$))|'(.)|(\d+)|(.)/).map{|m|(m[0]?(m[0].end_with?('"')?m[0]: m[0]+'"'): m[1]?"\"#{m[1]}\"": m.compact[0]).strip}.reject(&:empty?).map{|i|"'#{/\d+|./=~i ?i: i.inspect}'"}.join', '}]"

find(&:itself)어딘가에 보았던 트릭을 사용해 보았지만 .itself실제로는 방법이 아닙니다. 또한 정규식을 골프로 만들고 있지만 이미 읽을 수 없습니다.

우리가 멋진 방법으로 출력 할 필요가 없다면 (즉, 배열에서 문자열을 인용 할 필요가 없습니다) 전체 lotta 바이트를 절약 할 수 있습니다.

여전히 루비, 194 바이트 :

p$stdin.read.scan(/("(?:(?<!\\)\\"|[^"])+(?:"|$))|'(.)|(\d+)|(.)/).map{|m|(m[0]?(m[0].end_with?('"')?m[0]: m[0]+'"').gsub(/\\(.)/,'\1'): m[1]?"\"#{m[1]}\"": m.compact[0]).strip}.reject(&:empty?)

골프를 더 잘할 수 있을지 모르겠지만 어떻게해야할지 잘 모르겠습니다.


언 골프가 곧 온다. 나는 어느 시점에서 직접 골프를 다루기 시작했고 그것을 놀려 야 할 것이다.


0

파이썬 3, 228 바이트

import re;L=list
print(L(map(lambda i:i+'"'if i[0]=='"'and not i[-1]=='"'else i,map(lambda i:'"%s"'%i[1]if i[0]=="'"else i,filter(None,sum([L(i)for i in re.findall('(\'.)|(".*")|(\d+)|([^\w\"\'\s\\\])|(".*"?)',input())],[]))))))

여기에 길고 긴 2 줄짜리 라이너가 있습니다.


Python 3에서 테스트하십시오. 몇 가지 예는 다음과 같습니다.

$ python3 test.py
"PPCG"23+
['"PPCG"', '23', '+']

$ python3 test.py
'a "bc" +
['"a"', '"bc"', '+']

$ python3 test.py
12 34+-"abc"de'fg\"
['12', '34', '+', '-', '"abc"de\'fg\\"']

$ python3 test.py
"foo
['"foo"']

$ python3 test.py

[]

$ python3 test.py
' ""
['" "', '""']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.