regex - 将奇数和偶数正则表达式结合到正则语法中?

标签 regex prolog grammar dcg

我有一个类需要为其编写常规语法。语法为 {a,b,c},其中 a 和 c 的数量为奇数,但 b 的数量为偶数。

好的字符串示例:

  • babc
  • abcb
  • cba
  • accaccac
  • 交流

错误的字符串

  • babcb
  • abc
  • cbbca
  • 阿卡卡
  • aa
  • *空字符串

即使是 b,我的正则表达式也是 b*(ab*ab*)*b* (我不知道在哪里包含 c)

我的奇数 a 的正则表达式是 (c|a(b|c)*a)*a(b|c)*

我的奇数 c 的正则表达式是 (c|a(b|c)*c)*c(b|c)*

我认为常规语法看起来像这样:

s -> [a], a
s -> [c], c

a -> [a], a
a -> [b], b
a -> [c], c

b -> [b]
b -> [b], b
b -> [a], a
b -> [c], c

c -> [c], c
c -> [a], a
c -> [b], b

我认为很明显我很迷失。如有任何帮助,我们将不胜感激!

最佳答案

这是 SWI-Prolog 中可能的解决方案:

:- use_module(library(clpfd)).
:- use_module(library(lambda)).

odd_even(Lst) :-
    variables_signature(Lst, Sigs),
    automaton(Sigs, _, Sigs,
              % start in s, end in i
              [source(s), sink(i)],
              % if we meet 0, counter A of a is incremented of one modulo 2
              % the others are unchanged
              [arc(s, 0, s, [(A+1) mod 2, B, C]),
               arc(s, 1, s, [A, (B+1)mod 2, C]),
               arc(s, 2, s, [A, B, (C+1) mod 2]),
               arc(s, 0, i, [(A+1) mod 2, B, C]),
               arc(s, 1, i, [A, (B+1)mod 2, C]),
               arc(s, 2, i, [A, B, (C+1) mod 2])],
              % name of counters
              [A, B, C], 
              % initial values of counters
              [0, 0, 0], 
              % needed final values of counters
              [1,0,1]).

% replace a with 0, b with 1, c with 2
variables_signature(Lst, Sigs) :-
    maplist(\X^Y^(X = a -> Y = 0; (X = b -> Y = 1; Y = 2)), Lst, Sigs).

示例:

?- odd_even([a,c,c,a,c,c,a,c]).
true.

?- odd_even([a,c,c,a,c,c,a]).
false.

关于regex - 将奇数和偶数正则表达式结合到正则语法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46984048/

相关文章:

Java 正则表达式在字符串中查找数字

javascript - 正则表达式 - 替换行尾,而不是字符串?

prolog - Prolog中求和的解决方案

list - Prolog 添加 N 到 0 到列表

java - 从 Java 程序分析 C++ 文件

regex - 计算 qr 正则表达式中的捕获组?

javascript - 用于匹配特定数组增量的 JS Regex 忽略字符串和单独增量

prolog - 如何在序言中制作特定长度的随机列表而不重复?

java - ANTLR 生成空条件

token - 无法为非组合语法中的字符串文字创建隐式标记