1

对 Sblime 文本 2 的语法定义非常感兴趣

我已经学习了基础知识,但我不知道如何为 smth 编写 RE(和规则) variable = sentense,即myvar = func(foo, bar) + baz

我写不出比^\s*([^=\n]+)=([^=\n]+\n)(那行不通)更好的东西如何以正确的方式编写此 RE?

另外,我在为块定义 RE 时遇到了一些困难

IF i FROM .. TO ..
    ...
ELSE
    ...
END IF

锄头写吗?

4

1 回答 1

3

在这种情况下,您必须编写一个解析器。正则表达式不起作用,因为模式可能会有所不同。当您说“变量=句子”时,您已经注意到了。为此,您可以使用 spoofax 或 javacup 进行语法定义。我会给你一个JavaCup的片段:

扫描仪问题:假设“变量”遵循模式:(_|[a-zA-Z])(_|[a-zA-Z])* 和“数字”为:([0-9])+ 请注意number 可以是任何小数或整数,但在这里我将其声明为该模式,假设我的语言仅处理整数(或该模式的任何含义:))。

现在我们可以按照 JavaCUP 语法声明我们的语法。这或多或少像:

表达式 ::= 变量 "=" 句子

句子 ::= 句子 "+" 句子;
句子 ::= 句子“-”句子;
句子 ::= 句子 "*" 句子;
句子 ::= 句子 "/" 句子;

句子 ::= 数字;

...而且更进一步。

如果你从未有过任何编译器的类,它可能看起来很难看。另外,在解析器中避免无限循环有很多语法限制,具体取决于您使用的是哪个(RL 或 LL)。

无论如何,你的问题的真正答案是:你不能只用正则表达式做你想做的事,我需要更多的概念。

于 2012-11-23T03:06:53.580 回答