Parsing 解析上下文敏感语言

Parsing 解析上下文敏感语言,parsing,compiler-construction,antlr,context-sensitive-grammar,Parsing,Compiler Construction,Antlr,Context Sensitive Grammar,我正在阅读特伦斯·帕尔(Terence Parr)的《ANTLR权威参考》,他在书中说: 语义谓词是一种强大的语言 识别上下文敏感的方法 允许的语言结构 要驱动的运行时信息 认可 但书中的例子非常简单。我需要知道的是:ANTLR可以解析如下规则: xAy-->xBy 如果ANTLR不能解析这些规则,是否有其他工具处理上下文相关语法?ANTLR只解析LL(*)语法。它无法使用完整上下文敏感语言(如您提供的示例)的语法进行解析。我认为Parr的意思是ANTLR可以解析一些需要一些(左)上下文约束的语

我正在阅读特伦斯·帕尔(Terence Parr)的《ANTLR权威参考》,他在书中说:

语义谓词是一种强大的语言 识别上下文敏感的方法 允许的语言结构 要驱动的运行时信息 认可

但书中的例子非常简单。我需要知道的是:ANTLR可以解析如下规则:

xAy-->xBy


如果ANTLR不能解析这些规则,是否有其他工具处理上下文相关语法?

ANTLR只解析LL(*)语法。它无法使用完整上下文敏感语言(如您提供的示例)的语法进行解析。我认为Parr的意思是ANTLR可以解析一些需要一些(左)上下文约束的语言

特别是,可以在“简化操作”上使用语义谓词(我们为GLR解析器这样做) 由我们的应用程序使用,但我认为ANTLR的思想类似),用于检查解析器迄今为止收集的任何数据,无论是作为其他语义操作的特殊副作用,还是在部分构建的解析树中

对于我们基于DMS的系统,有一个上下文相关的检查来确保DO循环正确排列。考虑:

 DO  20, I= ...
   DO 10, J = ...
       ...
20  CONTINUE
10  CONTINUE
从解析器的角度来看,词法流如下所示:

DO  <number> , <variable> =  ...
    DO <number> , <variable> = ...
         ...
<number> CONTINUE
<number> CONTINUE
DO,=。。。
做。。。
...
继续
继续
然后,解析器如何知道哪个DO语句与哪个CONTINUE语句一起? (说每个DO都与最近的CONTINUE匹配是行不通的,因为FORTRAN可以 与多个DO头共享CONTINUE语句)

我们使用语义谓词“CheckMatchingNumbers”对以下规则进行约简:

block = 'DO' <number> rest_of_do_head newline 
         block_of_statements
         <number> 'CONTINUE' newline ; CheckMatchingNumbers
block='DO'头换行符的剩余部分
语句块
“继续”新行;核对匹配号码
检查DO关键字后面的数字与CONTINUE关键字后面的数字是否匹配。如果语义谓词表示它们匹配,则此规则的缩减成功,并且我们已将DO头与正确的CONTINUE对齐。如果谓词失败,则不建议进行缩减(并且从解析本地上下文的候选项中删除此规则);其他一些规则必须解析文本

使用共享continues处理FORTRAN嵌套的实际规则和语义谓词比这更复杂,但我认为这说明了问题的关键

您需要的是完整的上下文敏感解析引擎。我知道人们已经构建了它们,但我不知道有任何完整的实现,也不期望它们能够快速实现


我确实跟随了一段时间;这听起来像是一次接近实际的尝试。

在中编写上下文敏感解析器相对容易。此程序解析字符串
[a,is,less,than,b和,b,is,less,than,c]
,将其转换为
[a,好的,此规则意味着我们需要保存上下文,其中上下文无关语法看起来像-->BC,有关详细信息:@Bart:“在x和y的上下文中,a可以替换为b”@Ira,感谢您的澄清!
xAy-->xBy
可能会在Prolog中转换为a。+1没有完整的实现,而且这些工具效率不高。感谢您的帮助help@Radi当前位置我说我不知道。我肯定有人在某处实施了一个。
:- initialization(main).
:- set_prolog_flag('double_quotes','chars').

main :-
    rewrite_system([a,is,less,than,b,and,b,is,less,than,c],X),writeln('\nFinal output:'),writeln(X).

rewrite_rule([[A,<,B],and,[B,<,C]],[A,<,B,<,C]).
rewrite_rule([A,is,less,than,B],[A,<,B]).
rewrite_rule([[A,<,B],and,C,than,D],[[A,<,B],and,A,is,C,than,D]).
rewrite_rule([A,<,B],[[A,<,B]]).

rewritten(A) :- atom(A);bool(A).
bool(A) :- atom(A).
bool([A,<,B,<,C]) :- atom(A),atom(B),atom(C).
bool([A,and,B]) :- bool(A),bool(B).


% this predicate is from https://stackoverflow.com/a/8312742/975097
replace(ToReplace, ToInsert, List, Result) :-
    once(append([Left, ToReplace, Right], List)),
    append([Left, ToInsert, Right], Result).

rewrite_system(Input,Output) :-
    rewritten(Input),Input=Output;
    rewrite_rule(A,B),
    replace(A,B,Input,Input1),
    writeln(Input1),
    rewrite_system(Input1,Output).