标记基于堆栈的语言


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 '16

4
@ LegionMammal978是的,很认真。
Alex A.

1
可以输出到STDOUT吗?
门把手

2
@ZachGates是的,大多数语言也将\用作转义字符,因此,是的,如果您的语言显然需要它,则需要转义。
Downgoat

1
另外,在第一个示例中,结果的第一个元素应该是'"PPCG"'而不是just "PPCG"吗?
基金莫妮卡的诉讼

Answers:


8

视网膜68 64 63字节

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

要么

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

我认为这涵盖了所有时髦的边缘案例,甚至是挑战中未包含在测试案例中的案例。

在线尝试!


ang,这很短。做得很好!
基金莫妮卡的诉讼

我能够将其转换为95字节的ES6函数。应该是80,除了正则表达式不能反过来工作(边缘情况太多)。
尼尔

2

Ruby,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字节:

还是Ruby,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

Python 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())],[]))))))

这是一个不错的,很长的两线客。


在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
' ""
['" "', '""']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.