ANTLR 适合这个项目吗?
我正在寻找处理和转换用户输入的字符串,其中可能包含自定义函数。例如,用户可能会在字符串中写入类似 $CAPITALIZE('word') 的内容,而我想执行
使用 StringUtils 在后台进行实际转换。
我想用户有时会编写嵌套函数,例如:
$RIGHT_PAD($RIGHT($CAPITALIZE('a123456789'),6),3,'0')
其中预期输出为字符串值“A12345000”。
我尝试使用正则表达式将函数分开,但一旦嵌套,就不那么容易了。我想我可以尝试编写自己的解析器,在进行研究时我发现了一篇建议使用 ANTLR 的文章。
ANTLR 适合这样做吗?如果是这样,是否有任何类似的示例可供我查看?或者有人可以给我一个例子,说明如何在 ANTLR 中编写此代码,以便我可以拥有可以单独处理和以嵌套方式处理的自定义函数。
功能:
- $CAPITALIZE(字符串 str)
- $INDEX OF(字符串序列,字符串搜索序列)
- $LEFT(字符串 str, int len)
- $LEFT_PAD(字符串 str, int 大小,字符 padChar)
- $LOWERCASE(字符串 str)
- $RIGHT(字符串 str, int len)
- $RIGHT_PAD(字符串 str, int 大小, 字符 padChar)
- $STRIP(字符串str)
- $STRIP_ACCENTS(字符串输入)
- $SUBSTRING(字符串 str, int 开始)
- $SUBSTRING(字符串 str, int 开始, int 结束)
- $TRIM(字符串 str)
- $TRUNCATE(字符串 str, int maxWidth)
- $UPPERCASE(字符串 str)
基本示例:
- $CAPITALIZE('单词') → '单词'
- $INDEX_OF('单词', 'r') → 2
- $LEFT('0123456789',6) → '012345'
- $LEFT_PAD('0123456789',3, '0') → '0000123456789'
- $LOWERCASE('Word') → '单词'
- $RIGHT('0123456789',6) → '456789'
- $RIGHT_PAD('0123456789',3, '0') → '0123456789000'
- $STRIP('单词') → '单词'
- $STRIP_ACCENTS('单词') → '单词'
- $SUBSTRING('word', 1) → 'ord'
- $SUBSTRING('word', 0, 2) → 'wor'
- $TRIM('单词') → '单词'
- $TRUNCATE('更多单词', 3) → '更多'
- $UPPERCASE('单词') → '单词'
嵌套示例
- $LEFT_PAD($LEFT('123456789',6),3,'0') → '000123456'
- $RIGHT_PAD($RIGHT($CAPITALIZE('a123456789'),6),3,'0') → 'A12345000'
实际例子:我的实际示例的意思是,这就是我期望的字符串值的样子。你会注意到有一些变量的写法类似于${var}。在将字符串传递到 ANTLR 之前,这些变量将使用 Apache Commons StringSubstitutor 替换为实际字符串值(如果结果证明我应该使用它)
用户写入的初始字符串\HomeDir\Students\$RIGHT(${graduation.year},2)\$LEFT_PAD($LEFT(${state.id},6),3,'0')
StringSubstitutor处理后的字符串\HomeDir\Students\$RIGHT('2020',2)\$LEFT_PAD($LEFT('123456789',6),3,'0')
ANTLR处理后的字符串 (以及我的最终输出)
\HomeDir\学生\20\000123456
ANTLR 似乎是我应该用于这个项目的东西,还是其他更适合的东西?