如何<>
在语法环境中使用角括号?
我想描述我的编程语言支持以下结构:
List<int> myList = new List<int>();
List<List<int>> myList2 = new List<List<int>>();
Set<int> mySet = new Set<int>();
Bag<int> myBag = new MyBag<int>();
Array<int> myArray = new Array<int>();
因此,我使用语法环境来描述可能的结构:
\begin{grammar}
<collection_parameter_decl> ::= <ident>
\alt 'List' '<' <collection_parameter_decl> '>'
\alt 'Bag' '<' <collection_parameter_decl> '>'
\alt 'Set' '<' <collection_parameter_decl> '>'
\alt 'Array' '<' <collection_parameter_decl> '>'
\end{grammar}
不幸的是,我的编程语言中使用了尖括号,同时语法环境也使用它们来判断什么是 token。因此,整个代码的格式很丑陋:
答案1
我真的不知道答案应该是什么样的,但我确实注意到\char60
可以代替来<
获取字符的非解释版本。我在这里将其编入名为的宏中\?
。
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{syntax}
\newcommand\?{\char60}
\begin{document}
\begin{grammar}
<collection_parameter_decl> ::= \?ident>
\alt 'List' '\?' <collection_parameter_decl> '>'
\alt 'Bag' '\?' <collection_parameter_decl> '>'
\alt 'Set' '\?' <collection_parameter_decl> '>'
\alt 'Array' '\?' <collection_parameter_decl> '>'
\end{grammar}
\end{document}
答案2
假设您的引号始终是平衡的并且不包含尖括号中的元变量,您可以调整grammar
。
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{syntax}
\usepackage{etoolbox}
\AtBeginEnvironment{grammar}{%
\begingroup\lccode`~=`'\lowercase{\endgroup\let~}\grammarquote
\catcode`'=\active
}
\let\normallt=<
\begingroup
\catcode`'=\active
\catcode`<=\active
\gdef\grammarquote#1'{\begingroup\let<\normallt\rq#1\rq\endgroup}
\endgroup
\begin{document}
\begin{grammar}
<collection_parameter_decl> ::= <ident>
\alt 'List' '<' <collection_parameter_decl> '>'
\alt 'Bag' '<' <collection_parameter_decl> '>'
\alt 'Set' '<' <collection_parameter_decl> '>'
\alt 'Array' '<' <collection_parameter_decl> '>'
\end{grammar}
\end{document}
这个想法是将其'
变成一个活动字符,吸收下一个字符之前的所有内容'
,并在定义之后对其进行排版<
(在内部处于活动状态grammar
)以产生一个正常<
符号。