2013-05-10 49 views
1

我想为这个BNF语法编写preg_match函数。preg_match只有一些数字

EXP :: = EXP + TERM | EXP - TERM | TERM

TERM :: = TERM * FACTOR | TERM/FACTOR | FACTOR

FACTOR :: =(EXP)| DIGIT

DIGIT :: = 0 | 1 | 2 | 3

我试图这种方式写

$图案= “| [0-3 + - ()* /] + \ $$ |”;

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

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

编辑:

例: 1 + 22 $应该是无效的字符串,因为我只想号0,1,2,3,但没有任何数量> 3

谢谢。

+1

给你有什么&为例你想要什么输出? – Rikesh 2013-05-10 05:14:05

+0

为什么不直接运行tokenizer/parser并查看它解析是否正确?Regex是一个很差的解析替代品。 – Patashu 2013-05-10 05:18:32

回答

1

试试这种模式?

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

父母对于正则表达式的解决方案并不平凡;

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

允许您创建像右表达式(2 + 3)$,但也是错误的(2 + 3 $

写自己的词法分析器该