parsing - 如何在 DCG 中表示字母数字字符串?
问题描述
我正在尝试为编码为 S 表达式的命题演算编写解析器。
我已经取得了一些进展:
expression --> op.
op --> ['('], bin-op, bool, bool, [')'].
op --> ['('], unary-op, bool, [')'].
bool --> tok.
bool --> op.
bin-op --> ["IFF"].
bin-op --> ["IF"].
bin-op --> ["XOR"].
unary-op --> ["NOT"].
tok --> ["a"].
在swipl
,我从调用中得到了适当的响应phrase
:
?- phrase(expression, Ls).
Ls = ['(', "IFF", "a", "a", ')']
然而,这仅适用于tok
“a”。有没有办法在 DCG 中说“tok 是任何字母数字字符串”?我发现了这个,但我不确定如何将它应用到我正在做的事情中。
解决方案
如果您只想解析,那么以下令牌将起作用。
tok([A|B], B) :- an_code(A).
alpha_numeric(X) :-
between(0'0, 0'9, X); between(0'A, 0'Z, X); between(0'a, 0'z, X).
an_code(A) :- atom_codes(A, C), maplist(alpha_numeric, C).
?- phrase(expression, ['(', "IFF", "A1", "1A", ')']).
true
?- phrase(expression, ['(', "IFF", ".A1", "1A", ')']).
false.
?- phrase(expression, ['(', "IFF", ".A1", "(1A", ')']).
false.
使用 an_code 如下,您也可以生成公式:
an_code(A) :- var(A) ->
length(C,L), L >= 1,
maplist(alpha_numeric, C),
string_codes(A, C);
atom_codes(A, C), maplist(alpha_numeric, C).
?- phrase(expression, Ls).
Ls = ['(', "IFF", "0", "0", ')'] ;
Ls = ['(', "IFF", "0", "1", ')'] ;
Ls = ['(', "IFF", "0", "2", ')'] ;
?- nth0(1, Ls, "XOR"), phrase(expression, Ls).
Ls = ['(', "XOR", "0", "0", ')'] ;
Ls = ['(', "XOR", "0", "1", ')'] ;
Ls = ['(', "XOR", "0", "2", ')']
?- nth0(1, Ls, "NOT"), phrase(expression, Ls).
Ls = ['(', "NOT", "0", ')'] ;
Ls = ['(', "NOT", "1", ')'] ;
Ls = ['(', "NOT", "2", ')']
在生成版本中,使用的一些谓词是swi-prolog
内置的,因此它们不能与其他实现一起使用。
内置的 swi-prologchar_type/2
也可以用作 alpha_numeric char_type(C, alnum)
。以下是使用swi-prolog
谓词的 dcg 样式代码。
tok -->
[A],
{ string_codes(A, AC),
maplist([C]>>char_type(C, alnum), AC)
}.
推荐阅读
- react-native - Nativebase - 单击输入时如何显示日期选择器?
- clojure - 当我使用函数文字时,我不理解 ArityException
- javafx - 如何仅关闭 Java FX 中的一个阶段(不退出所有应用程序)?
- ios - 如何使用 Visual Format Language 在 Swift 中设置约束?
- winapi - 如何使用 winapi crate 为 Windows 制作托盘图标?
- c++ - 如何在 WinForm GUI 中使用 Crypto++?
- javascript - 从 html 或 javascript 到 python Django 的通信
- x86 - 像 Denormals-Are-Zero (DAZ) 这样的非正规标志会影响相等比较吗?
- java - 如何使用最新的 Google Sign-In and Drive REST api 上传 SQLite 数据库文件?
- solr - SOLR,如何在 SOLR UI 中设置allowleadingwildcard?