我正在研究一种用于个人用途的小“开发”语言。我根本不打算让它先进(虽然我不知道后来会发生什么),但我遇到了问题。
我对RegExp不太熟悉,我想用它来检查代码的一部分是定义新变量还是运行函数。在这种情况下,我需要一个RegExp来检查用户是否正在定义一个变量。
所以,让我说我有这样一个部分: $ abcd = 5
现在,RegExp应符合下一个标准: - 它应该检查第一个字母是否是“$”(这很简单:“\ $”) - 现在,“$”之后的字母(让我们称之为变量名)是问题所在。变量 名称可以包含字母[a-z,A-Z],数字[0-9]和下划线[_] - 接下来,变量名和“=”之间的空间可以无限长(它可以 是一个空间(),或数百万个空间 - 这应该没有区别 - 比等号(这很容易 - “\ =”) - 与第三个相同,适用于等号后的空格 - 并在最后变量值。应该没有RegExp验证。
提前致谢!
答案 0 :(得分:3)
您不希望将正则表达式用于此类任务。它很快就会变成一场噩梦。你想要的是一个简单的语法和一个递归下降的解析器。
话虽如此,这样的事情应该有效:
/\$[a-zA-Z0-9_]+\s*=\s*[0-9]+$/
这只会匹配您为变量指定数字的情况。如果你想分配其他值,你将不得不使正则表达式更复杂(看看我的意思是它变成了一场噩梦?:))。例如,如果要为变量指定字符串值,则正则表达式将不同。您还必须考虑转义引号和连接等内容。用正则表达式做这些事情非常困难。
函数调用和变量定义的简单语法可能如下所示:
<program> ::= { <statement> }
<statement> ::= <function-call> | <variable-assignment>
<function-call> ::= <identifier>, '(', [ <parameter-list> ], ')'
<identifier> ::= <valid-starting-char>, { <valid-char> }
<valid-starting-char> ::= [A-Za-z_]
<valid-char> ::= [A-Za-z]
<parameter-list> ::= <identifier>, { ',', <identifier> }
<variable-assignment> ::= '$', <identifier>, '=', <value>
<value> ::= <number> | <string>
<number> ::= <digit>, { <digit> }
<string> ::= '"', ( { <character> | <escaped-character> } ), '"'
<character> ::= .
<escaped-character> ::= '\', <character>
该语法不考虑连接,带小数值的数字(即小数点后)和负数。但它很简单,应该给你一个很好的起点。有许多教程告诉您如何从recursive-descent创建EBNF解析器。您仍需要对输入进行标记化。
答案 1 :(得分:0)
好的,首先,如果你正在创建一种语言,你需要一个词法分析器来标记字符串(基于正则表达式)和解析器来解释语言(基于语法)。
话虽如此,你的正则表达式是:
\$[a-zA-Z_0-9]+[ \t\n]*=[ \t\n]*[0-9]+
答案 2 :(得分:0)
只需快速了解上述回复:
[a-zA-Z0-9_]
与
相同\w