使用将词法分析器和解析器分开的工具,通常在词法分析期间几乎没有空间让您更改标记。词法分析器通常独立于解析器运行,并且如果可能的话,使词法分析上下文敏感是 hacky(您可能想在谷歌上搜索PEG或无扫描仪解析,其中词法分析和解析之间没有真正的分离)。
但是,这完全取决于您使用的工具。我已经使用 ANTLR 创建了一个 PCRE 解析器,如果解析失败,它会使用回溯。因此,如果在解析后{2,5a
无法构造量词(a
无效),解析器将回溯到该字符并"{"
从中生成一个LITERAL
标记,然后继续。以一些 RAM 为代价,我启用了memoization ,导致解析器在大输入时仍然表现良好。
它解析X{2,5asdf}
为:
'- ALTERNATIVE
|- ELEMENT
| '- LITERAL='X'
|- ELEMENT
| '- LITERAL='{'
|- ELEMENT
| '- LITERAL='2'
|- ELEMENT
| '- LITERAL=','
|- ELEMENT
| '- LITERAL='5'
|- ELEMENT
| '- LITERAL='a'
|- ELEMENT
| '- LITERAL='s'
|- ELEMENT
| '- LITERAL='d'
|- ELEMENT
| '- LITERAL='f'
'- ELEMENT
'- LITERAL='}'
并且X{2,5}
作为:
'- ALTERNATIVE
'- ELEMENT
|- LITERAL='X'
'- QUANTIFIER
|- NUMBER='2'
|- NUMBER='5'
'- GREEDY
您可以在此处使用解析器:http: //pcreparser.appspot.com/
ANTLR 语法可以在这里找到:https ://github.com/bkiers/PCREParser/blob/master/src/grammar/PCRE.g