- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 LL(k) EBNF 语法来解析字符流。我需要三种不同类型的 token :
CHARACTERS
letter = 'A'..'Z' + 'a'..'z' .
digit = "0123456789" .
messageChar = '\u0020'..'\u007e' - ' ' - '(' - ')' .
TOKENS
num = ['-'] digit { digit } [ '.' digit { digit } ] .
ident = letter { letter | digit | '_' } .
message = messageChar { messageChar } .
前两个 token 声明很好,因为它们不共享任何公共(public)字符。
但是,第三个 message
无效,因为某些字符串可能既是 num
又是 message
(例如 “123”
),其他字符串可以是 ident
和 message
(例如 “Hello”
)。因此,分词器无法正确区分。
另一个例子是区分整数和实数。除非您要求所有实数至少有一位小数(意味着 1 需要编码为 1.0,这对我来说不是一个选项),否则我无法在语法中获得这两个数字之间差异的支持类型。我必须将所有值都表示为实数,并在该点之后进行检查。这很好,但不是最优的。我真正的问题是 message
token 。我找不到解决方法。
所以问题是,我可以使用 LL(k) EBNF 语法来做到这一点吗?我正在使用 CoCo/R 生成解析器和扫描器。
如果我无法使用 LL(k) EBNF 做到这一点,那么我还可以考虑哪些其他选项?
编辑这是我从 CoCo/R 得到的输出:
Coco/R (Apr 23, 2010)Tokens double and message cannot be distinguishedTokens ident and message cannot be distinguished...9 errors detected
最佳答案
试试这个:
CHARACTERS
letter = 'A'..'Z' + 'a'..'z' .
digit = "0123456789" .
messageChar = '\u0020'..'\u007e' - ' ' - '(' - ')' .
TOKENS
double = ['-'] digit { digit } [ '.' digit { digit } ] .
ident = letter { letter | digit | '_' } .
message = messageChar { messageChar } CONTEXT (")") .
哦,我必须指出 '\u0020'
是 unicode SPACE,您随后将用“- ' '
”将其删除。哦,如果您不需要多个字符前瞻,您可以使用 CONTEXT (')')
。这在您的情况下不起作用,因为上面的所有标记都可以出现在 ')'
之前。
FWIW:CONTEXT
不会使用所包含的序列,您仍然必须在生产中使用它。
编辑:
好的,这似乎有效。真的,这次我是认真的:)
CHARACTERS
letter = 'A'..'Z' + 'a'..'z' .
digit = "0123456789" .
// messageChar = '\u0020'..'\u007e' - ' ' - '(' - ')' .
TOKENS
double = ['-'] digit { digit } [ '.' digit { digit } ] .
ident = letter { letter | digit | '_' } .
// message = letter { messageChar } CONTEXT (')') .
// MessageText<out string m> = message (. m = t.val; .)
// .
HearExpr<out HeardMessage message> =
(.
TimeSpan time;
Angle direction = Angle.NaN;
string messageText = "";
.)
"(hear"
TimeSpan<out time>
( "self" | AngleInDegrees<out direction> )
// MessageText<out messageText>
{
ANY (. messageText += t.val; .)
}
')'
(.
message = new HeardMessage(time, direction, new Message(messageText));
.)
.
ANY
将读取字符,直到遇到“)”或空格。我将它放在一个连接每个值的循环中,但您可能不想这样做。不过,您可能希望将其放入循环中,这样当它看到“over here”时,它不会返回“over”,而是返回“here”。您可以对 messageText 进行简单的长度检查,或进行其他有效性检查,例如将 t.val 添加到列表并检查计数。真的什么都可以。您还可以使用正则表达式进行测试,以确保它符合您需要检查的任何模式。
编辑(2011 年 4 月 8 日):使用 Coco/R 与整数和实数的示例
COMPILER Calculator
CHARACTERS
digit = "0123456789".
TOKENS
intNumber = ['-'] digit { digit } .
realNumber = ['-'] { digit } "." digit { digit }
[("e" | "E") ["+" | "-"] digit {digit}] .
PRODUCTIONS
Calculator = { Expression "=" } .
Expression = Term { "+" Term | "-" Term }.
Term = Factor { "*" Factor | "/" Factor }.
Factor = intNumber | realNumber .
END Calculator.
编辑(2011 年 4 月 9 日)
Factor<out double value>
(. value = 0.0; .)
=
(
intNumber
(. value = Convert.ToDouble(t.val); .)
|
realNumber
(. value = Convert.ToDouble(t.val); .)
)
| "(" Expression<out value> ")"
.
或
Factor<out double value>
(. value = 0.0; .)
=
( intNumber | realNumber )
(. value = Convert.ToDouble(t.val); .)
| "(" Expression<out value> ")"
.
关于parsing - 如何处理 EBNF 语法中不同标记中的重叠字符组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3046085/
如何用 EBNF 表示法描述带引号的字符串(如 C、Java 等)? 我在考虑这个(见下文),但 AnyCharacter 部分也将匹配双引号 (")。 QuotedString = '"' AnyC
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Forth language EBNF rule for an infinite loop or if state
有没有EBNF描述 Forth 无限循环或 if 语句的规则? 最佳答案 EBNF 用于描述语法。无限循环或其他循环通常不会落入它所描述的范围内。因此,您将查看 EBNF 的无限循环,它看起来像: i
是否有一个 EBNF 铁路生成器可以创建更大的 block ,而不是每个语法生成一个图表? 我试过了 http://bottlecaps.de/rr/ui它非常好:可以从 W3C 规范(例如 http
有谁知道 Java 语言的 (E)BNF 的准确来源?最好是来自权威来源,例如太阳。 谢谢。 最佳答案 我相信第 3 版是最新的: JLS 3rd edition 关于Java EBNF?,我们在St
假设我有以下 EBNF: ProductNo ::= Digitgroup "-" Lettergroup; Digitgroup ::= Digit Digit? Digit? Digit?;
您是否知道一个语法分析器模块(用 Ruby、Python、Javascript 编写...),给定一个标记列表和一个 EBNF -like 语法(作为简单字符串传递),返回解析后的树?我发现最接近的是
我想设计一种满足 EBNF 的数学语言,让我编写尽可能接近自然数学语言的方程组和不等式。我想为这种小语言有两个解析器,一个解析器准备用这种语言编写的等式/不等式以供发布,另一个解析器准备它进行计算,即
我想使用扩展巴科斯-诺尔形式 (EBNF) 上下文无关语法定义一组无序的值。在 EBNF 中定义一个无序列表的值很容易,例如: value = 'A' | 'B' | 'C'; list = valu
在为语言解析器定义语法时,如何处理可能出现在文本中任何位置的注释(例如/* .... */)等内容? p> 当事物结构化时,从标签内的标签构建语法似乎效果很好,但注释似乎会抛出一切。 您只需分两步解析
我目前正在使用 lark parser for python尝试阅读一些问题规范。我对扩展 Backus-Naur 形式的“正确”语法感到困惑,尤其是 LHS 和 RHS 是如何分开的。 wikipe
我收到一个解析符合 EBNF 语法的文本的任务。有我可以使用的工具/库吗? 最佳答案 ANTLR是解析EBNF的标准工具。 参见Good parser generator (think lex/yac
我正在使用 LL(k) EBNF 语法来解析字符流。我需要三种不同类型的 token : CHARACTERS letter = 'A'..'Z' + 'a'..'z' . digit = "
我目前正在使用 lark parser for python尝试阅读一些问题规范。我对扩展 Backus-Naur 形式的“正确”语法感到困惑,尤其是 LHS 和 RHS 是如何分开的。 wikipe
我有以下数据: dbCon= { main = { database = "db1", hostname = "db1.serv.com", m
我最近需要为 C# 编写一个基本反射(reflect) SQL 的流畅界面。是的,我知道 LINQ to SQL,但我对“更接近金属”很感兴趣——有一些东西基本上只提供 在 C# 中的 Intelli
我正在使用 CocoR 生成类似 java 的扫描器/解析器: 我在创建 EBNF 表达式以匹配代码块时遇到了一些麻烦: 我假设一个代码块被两个众所周知的标记包围:示例: public method(
我不确定我是否将 EBNF 翻译成正确的代码,所以如果有人可以看看其中一种我很难做到的方法,那就太好了。 这是 EBNF 语法: program ::= P {declare} B {state
我正在尝试使用 Grako 和 Python 为 Cisco IOS 和 ASA 配置编写解析器。我试图弄清楚如何在 EBNF 中表示“作用域”关键字 - 例如,“描述”关键字必须出现在 interf
我正在使用 Grako EBNF/PEG parser . 我知道 EBNF 语法允许获取满足给定选项之一的表达式: (a | b | c) 是否有类似的语法部分或解决方法允许获取 a、b 和 c 的
我是一名优秀的程序员,十分优秀!