我已经学习了基础知识,但我不知道如何为 smth 编写 RE(和规则)
variable = sentense
,即myvar = func(foo, bar) + baz
我写不出比^\s*([^=\n]+)=([^=\n]+\n)
(那行不通)更好的东西如何以正确的方式编写此 RE?
另外,我在为块定义 RE 时遇到了一些困难
IF i FROM .. TO ..
...
ELSE
...
END IF
锄头写吗?
我已经学习了基础知识,但我不知道如何为 smth 编写 RE(和规则)
variable = sentense
,即myvar = func(foo, bar) + baz
我写不出比^\s*([^=\n]+)=([^=\n]+\n)
(那行不通)更好的东西如何以正确的方式编写此 RE?
另外,我在为块定义 RE 时遇到了一些困难
IF i FROM .. TO ..
...
ELSE
...
END IF
锄头写吗?
在这种情况下,您必须编写一个解析器。正则表达式不起作用,因为模式可能会有所不同。当您说“变量=句子”时,您已经注意到了。为此,您可以使用 spoofax 或 javacup 进行语法定义。我会给你一个JavaCup的片段:
扫描仪问题:假设“变量”遵循模式:(_|[a-zA-Z])(_|[a-zA-Z])* 和“数字”为:([0-9])+ 请注意number 可以是任何小数或整数,但在这里我将其声明为该模式,假设我的语言仅处理整数(或该模式的任何含义:))。
现在我们可以按照 JavaCUP 语法声明我们的语法。这或多或少像:
表达式 ::= 变量 "=" 句子
句子 ::= 句子 "+" 句子;
句子 ::= 句子“-”句子;
句子 ::= 句子 "*" 句子;
句子 ::= 句子 "/" 句子;
句子 ::= 数字;
...而且更进一步。
如果你从未有过任何编译器的类,它可能看起来很难看。另外,在解析器中避免无限循环有很多语法限制,具体取决于您使用的是哪个(RL 或 LL)。
无论如何,你的问题的真正答案是:你不能只用正则表达式做你想做的事,我需要更多的概念。