Ometa是"一种新的面向对象的模式匹配语言".我在Oz工具等语言中遇到了模式匹配,以解析之前的Lexx/Yacc或Pyparsing等语法.尽管查看示例代码,阅读讨论以及与朋友交谈,我仍然无法真正理解Ometa的特殊之处(或者至少为什么有些人认为是这样).任何解释?
我一直在研究Haskell,我非常想在其中编写一个编译器(作为一种学习练习),因为它的许多先天特性可以很容易地应用于编译器(特别是一个递归的体面编译器).
我无法理解的是如何用Haskell-ian方式表示语言的语法.我的第一个想法是使用递归数据类型定义,但我无法看到我如何使用它们来匹配语言中的关键字("if").
非常感谢的想法和建议,
皮特
这个
background:url(http://url);
Run Code Online (Sandbox Code Playgroud)
这个
background:url("http://url");
Run Code Online (Sandbox Code Playgroud)
或这个
background:url('http://url');
Run Code Online (Sandbox Code Playgroud) 我想编写一个词法分析器发电机转换的Matlab语言为C#,C++等的基本子集来帮助我做到这一点,我想找到包含MATLAB正式语法的文件.花了一点时间研究这个,似乎mathworks没有提供.有谁知道我在哪里可以找到这样的文件?
我正在分析一个大型公共数据集,其中包含大量冗长的人类可读字符串,这些字符串是由一些常规(在形式语言理论意义上)语法明确生成的.
一个接一个地查看这些字符串集来查看模式并不太难; 不幸的是,大约有24,000个这些独特的字符串分为33个类别和1714个子类别,因此手动执行此操作有点痛苦.
基本上,我正在寻找一个现有的算法(最好使用现有的参考实现)来获取任意的字符串列表,并尝试推断一些可用于生成的正则表达式的最小化(对于一些合理的最小化定义)它们(即从该语法生成的语言中推导出一组有限字符串中的常规语法).
我已经考虑过重复贪婪最长的常见子串消除,但这只是到目前为止,因为除了完全匹配之外它不会崩溃,所以不会检测到,例如,在特定位置的变化数字串的常见模式语法.
暴力强迫任何不会脱离常见子串消除的东西是可能的,但可能在计算上不可行.(另外,我想过这个问题,有可能是一个"阶段排序"和/或子淘汰"当地最低"的问题,因为你可能会做出最终迫使最终语法贪婪的字符串匹配要少压缩/即使它看起来是最好的减少最小).
我正在尝试构建一个Lisp语法.容易,对吗?显然不是.
我提出这些输入并收到错误......
( 1 1)
23 23 23
ui ui
Run Code Online (Sandbox Code Playgroud)
这是语法......
%%
sexpr: atom {printf("matched sexpr\n");}
| list
;
list: '(' members ')' {printf("matched list\n");}
| '('')' {printf("matched empty list\n");}
;
members: sexpr {printf("members 1\n");}
| sexpr members {printf("members 2\n");}
;
atom: ID {printf("ID\n");}
| NUM {printf("NUM\n");}
| STR {printf("STR\n");}
;
%%
Run Code Online (Sandbox Code Playgroud)
就像我所知,我需要一个非终端定义为一个程序,整个解析树可以挂起.但我尝试了它似乎没有用.
编辑 - 这是我的"顶级终端"方法:
program: slist;
slist: slist sexpr | sexpr;
Run Code Online (Sandbox Code Playgroud)
但它允许以下问题:
( 1 1
Run Code Online (Sandbox Code Playgroud)
Edit2:FLEX代码是......
%{
#include <stdio.h>
#include "a.yacc.tab.h"
int linenumber;
extern int yylval;
%}
%% …
Run Code Online (Sandbox Code Playgroud) 我遵循"优先级爬坡"部分中给出的解释这个网页实现使用各种前缀的一元和二元中缀运算符的优先级爬坡算法算术评估.我还想包括三元运算符(即三元条件运算符?:
).
网页上给出的算法使用以下语法:
E --> Exp(0)
Exp(p) --> P {B Exp(q)}
P --> U Exp(q) | "(" E ")" | v
B --> "+" | "-" | "*" |"/" | "^" | "||" | "&&" | "="
U --> "-"
Run Code Online (Sandbox Code Playgroud)
如何将三元运算符合并到这个语法中?
我的问题一方面是关于Applicative和Monad类型的类,另一方面是关于Chomsky层次结构的无上下文和上下文敏感的语法级别.
我听说类型类和语法级别之间存在对应关系.这种通信有多精确?
也就是说,所有无上下文的语法都可以使用比Applicative组合器更强的语法进行解析,并且所有语法都可以使用比Applicative combinators更强大的语句来解析吗?换句话说,Applicative类型类是否完全对应于无上下文语法?
同样的问题,除了'上下文无关'取代'上下文敏感'和由Monad应用.
赏金澄清: 类型类(es)对应语法水平吗?例如,是否有一组类型类提供表达常规语言所需的所有操作,仅此而已?
问题的动机是我正在研究解析器,并希望根据我使用的组合器确定我的实现所处的语法级别.这可能吗?
这个问题的灵感来自Is sizeof(void())一个法律表达?但有一个重要的区别,如下所述.
有问题的表达是:
sizeof( int() )
Run Code Online (Sandbox Code Playgroud)
在C++语法中出现:
一元表达式:
sizeof
一元表达式sizeof (
类型ID)
但是,( int() )
可以使用不同的含义来匹配这两种情况:
int
prvalue,用多余的括号括起来int
.在语义约束中sizeof
,即C++ 14 [expr.sizeof]/1,它解释了表单sizeof(
type-id )
可能不适用于函数类型.
但是我不确定违反该语义约束是否意味着它sizeof( int() )
是正确的并使用sizeof
一元表达形式; 或者是否有其他规则在语法匹配的早期阶段消除两个案例的歧义.
NB.对于另一个问题sizeof(void())
,解释都不是有效的,因此可以认为编译器拒绝表达式是错误的,表明它与type-id形式匹配是正确的.但是,gcc拒绝sizeof( int() )
了有关type-id的消息.
要明确的是,我的问题是:"这是sizeof( int() )
一个法律表达吗?",特别是关于上述两个项目符号案例匹配时语法匹配如何工作的细节.
更新/注意事项:
(仔细读:)
我有一个包含可变数量的段(简化)的字符串:
$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
Run Code Online (Sandbox Code Playgroud)
我想现在匹配段并通过匹配数组返回它们:
$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
Run Code Online (Sandbox Code Playgroud)
这只会返回捕获组2 的最后一个匹配:DD
.
有没有办法,我可以检索所有的子模式捕获(的方式AA
,BB
,DD
)与一个正则表达式执行?不preg_match_all
适合这个吗?
无论是$subject
和$pattern
简化.自然地与这样的通用列表AA
,BB
..是更容易与其它功能(例如,以提取explode
),或与的的变化$pattern
.
但我特别询问如何使用preg_...
-family函数返回所有子组匹配.
对于现实生活中的情况,假设您有多个(嵌套)级别的子模式匹配变量.
这是用于描述一些背景的伪代码的示例.想象一下:
令牌的常规定义:
CHARS := [a-z]+
PUNCT := …
Run Code Online (Sandbox Code Playgroud)