我正在使用Jison解析器生成器来处理Javascript,并且我的语言规范存在问题。
我正在编写的程序将是一个可以处理英尺,英寸和十六分之一的计算器。 为此,我有以下规范:
%%
([0-9]+\s*"'")?\s*([0-9]+\s*"\"")?\s*([0-9]+\s*"s")? {return 'FIS';}
[0-9]+("."[0-9]+)?\b {return 'NUMBER';}
\s+ {/* skip whitespace */}
"*" {return '*';}
"/" {return '/';}
"-" {return '-';}
"+" {return '+';}
"(" {return '(';}
")" {return ')';}
<<EOF>> {return 'EOF';}
这些行中的大多数都来自基本的计算器规范。我只是添加了第一行。
正则表达式正确匹配英尺,十六英尺,例如6'4"
(六英尺,四英寸)或4"5s
(4英寸,五十六分之一),数字和指标之间有任何类型的空白
问题是正则表达式还匹配空字符串。因此,词法分析总是在行的开头记录一个FIS,然后解析失败。
这是我的问题:有没有办法修改这个正则表达式,以保证它只匹配一个非零长度的字符串?
修改
虽然正则表达式中包含捕获组,但我不需要捕获这些组。我知道我可以使用非捕获组,但如果没有(?:...)
,它会更清晰。
答案 0 :(得分:1)
您可以在正则表达式的开头添加(?=.)
。
答案 1 :(得分:0)
问题是第一行中的所有内容都是可选的 - ?
(0或1)或*
(0或更多)。
我不太熟悉帝国体系(我以前从未见过十六分之一......),但也许就像
([0-9]+\s*["'s])+ (with whatever escaping is necessary for the " and ' - I'm not a javascript guy)
这肯定会确保它与空字符串不匹配,问题是它会允许像5s 4“6'这样的东西,这可能不是你想要的......