1

我想为这个 BNF 语法编写 preg_match 函数。

经验 ::= 经验 + 期限 | 经验 - 期限 | 学期

期限 ::= 期限 * 因素 | 期限/因素 | 因素

因素 ::= ( 经验 ) | 数字

数字 ::= 0 | 1 | 2 | 3

我试着这样写

$pattern = "|[0-3+-()*/]+\$$|";

但问题是,它接受字符串 33$,根据我的语法,它是无效的,所以根据我的语法 1+22$ 应该是无效的,因为数字应该是 0|1|2|3。

我犯了什么错误?有人能帮帮我吗。

编辑:

示例: 1+22$ 应该是无效字符串,因为我只想要数字 0,1,2,3 而不是任何大于 3 的数字

谢谢你。

4

1 回答 1

1

试试这个模式?

/^([0-3][+-*/])+[0-3]\$$/

带括号的解决方案对于正则表达式来说不是微不足道的;

/^(\(?[0-3]\)?[+-*/])+[0-3]\)\$$/

允许您创建正确的表达式,例如 (2+3)$,但也可以创建错误的 (2+3$

为此编写您自己的词法分析器

于 2013-05-10T06:15:36.090 回答